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

题目链接

题目:

分析:

  • 我们很明显, 可以从峰值位置将数组分成两段, 具有**"二段性",** 所以可以用二分查找
  • 因为arr是山峰数组, 不存在相等的情况
  • 如果arrmid > arrmid + 1, 说明mid的位置可能是峰值, 移动right = mid
  • 如果arrmid < arrmid + 1, 说明mid的位置一定不是峰值, 移动left = mid + 1
  • 所以可以匹配二分查找中的模版二, 此时,mid = left + (right - left) /2
  • 因为没有等于的情况, 所以模版三也适用:
  • 如果arrmid > arrmid - 1, 说明mid的位置可能是峰值, 移动left = mid
  • 如果arrmid < arrmid - 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 分钟前
约瑟夫环问题
算法
科技大视界2 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴2 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe2 小时前
算法滑动窗口
数据结构·算法
怪兽学LLM2 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展
可编程芯片开发3 小时前
基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机
算法
酿情师3 小时前
区块链共识算法深度拆解:PoW、PoS、PBFT、Raft 原理解析
算法·区块链·共识算法
hansang_IR3 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
退休倒计时3 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript
不是az3 小时前
力控相关知识点
算法·机器学习·最小二乘法