Leetcode162 寻找峰值

峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

思路:

因为题目将数组边界看成最小值,而我们只需要找到其中一个波峰,因此只要不断地往高处走,一定会有波峰。那我们可以每次找一个标杆元素,将数组分成两个区间,每次就较高的一边走,因此也可以用分治来解决,而标杆元素可以选择区间中点。

具体做法:

  • step 1:二分查找首先从数组首尾开始,每次取中间值,直到首尾相遇。
  • step 2:如果中间值的元素大于它右边的元素,说明往右是向下,我们不一定会遇到波峰,但是那就往左收缩区间。
  • step 3:如果中间值大于右边的元素,说明此时往右是向上,向上一定能有波峰,那我们往右收缩区间。
  • step 4:最后区间收尾相遇的点一定就是波峰。

图示

Leetcode162 寻找峰值_第1张图片

代码如下:

public int findPeakElement (int[] nums) {

    int left = 0,right = nums.length - 1;
    while(left < right){

        int mid = left + (right-left)/2;
        //右边是往上,一定能找到波峰
        if(nums[mid] < nums[mid+1])
            left = mid + 1;
          //左边是往上,一定能找到波峰
        else if(nums[mid] > nums[mid+1])
            right = mid;
    }
    return right;
}

 

你可能感兴趣的:(二分查找)