[LeetCode]162. 寻找峰值(java实现)二分

1. 题目

2. 读题(需要重点注意的东西)

思路(二分): 1、当nums[i - 1] < nums[i]时: ① 如果从 i - 1 到 n - 1是单调的,那么这条直线单调上升,nums[n - 1] 就是峰值 ② 如果从 i - 1 到 n - 1不是单调的,那么一定存在一个点,使得nums[i] > nums[i + 1],这个点就是峰值 所以,当nums[i - 1] < nums[i]时,从 i - 1 到 n - 1中,一定存在一个峰值;

2、当nums[i - 1] > nums[i]时:同理可得[0,i−1]中一定包含一个峰值;

由此可知,存在一个性质,能将这段数分为两半,某一边一定有峰值,每次可以将答案区间缩小一半,因此可以使用二分求出这个峰值。

3. 解法

---------------------------------------------------解法---------------------------------------------------

class Solution {
          
   
    public int findPeakElement(int[] nums) {
          
   
        int l = 0,r = nums.length - 1;
        while(l < r){
          
   
            int mid = l + r >> 1;
            if(nums[mid] > nums[mid+1]) r = mid;
            else l = mid + 1;
        }
        return l;
    }
}

可能存在的问题:

4. 可能有帮助的前置习题

5. 所用到的数据结构与算法思想

    二分

6. 总结

经验分享 程序员 微信小程序 职场和发展