山脉数组的峰顶索引 ---- 二分查找

题目链接

题目:

分析:

  • 我们很明显, 可以从峰值位置将数组分成两段, 具有**"二段性",** 所以可以用二分查找
  • 因为arr是山峰数组, 不存在相等的情况
  • 如果arr[mid] > arr[mid + 1], 说明mid的位置可能是峰值, 移动right = mid
  • 如果arr[mid] < arr[mid + 1], 说明mid的位置一定不是峰值, 移动left = mid + 1
  • 所以可以匹配二分查找中的模版二, 此时,mid = left + (right - left) /2
  • 因为没有等于的情况, 所以模版三也适用:
  • 如果arr[mid] > arr[mid - 1], 说明mid的位置可能是峰值, 移动left = mid
  • 如果arr[mid] < arr[mid - 1], 说明mid的位置一定不是峰值, 移动right = mid - 1
  • 所以可以匹配二分查找中的模版三, 此时,mid = left + (right - left + 1) /2

代码:

java 复制代码
class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left = 1;
        int right = arr.length-2;
        while(left < right){
            ///int mid = left + (right - left) / 2;
            //if(arr[mid] > arr[mid + 1]) right = mid;
            //else left = mid + 1 ;
            int mid = left + (right - left + 1) / 2;
            if(arr[mid] > arr[mid - 1]) left = mid;
            else right = mid - 1;
        }
        return left;
    }
}
相关推荐
啊我不会诶8 分钟前
Codeforces Round 1083 (Div. 2)vp补题
c++·学习·算法
cpp_250111 分钟前
P1203 [IOI 1993 / USACO1.1] 坏掉的项链 Broken Necklace
数据结构·c++·算法·线性dp
_小草鱼_11 分钟前
【搜索与图论】BFS(广度优先搜索)
算法·图论·bfs·宽度优先
weixin_4219226912 分钟前
分布式日志系统实现
开发语言·c++·算法
不想看见40413 分钟前
Daily Temperatures单调栈--力扣101算法题解笔记
算法
炽烈小老头14 分钟前
【每天学习一点算法 2026/03/21】颜色分类
学习·算法
qyzm16 分钟前
天梯赛练习题
数据结构·python·算法·贪心算法
灰色小旋风17 分钟前
力扣17 电话号码的字母组合(C++)
c++·算法·leetcode
无敌憨憨大王18 分钟前
并查集(图论)
数据结构·算法·图论
xiaoye-duck19 分钟前
《算法题讲解指南:动态规划算法--路径问题》--7.礼物的最大价值,8.下降路径最小和
c++·算法·动态规划