讨论/《二分查找》 - 寻找峰值/
《二分查找》 - 寻找峰值
共 6 个回复

循环结束的时候 L + 1 = R
在循环体中 nums[L] < nums[L + 1] && nums[R] > nums[R + 1]
所以必然有nums[R - 1] < nums[R] < nums[R + 1]
所以我觉得最后返回的地方直接返回R即可😛

2

模板III C++

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int L = 0, R = nums.size() - 1, mid;
        while (L + 1 < R) {
            mid = L + (R - L)/2;
            if (nums[mid] > nums[mid + 1]) {
                R = mid;
            }
            else {
                L = mid;
            }
        }
        //post processing
        return nums[L] > nums[R] ? L : R;
    }
};
2

所以跟模版2最后的不同也被你抹杀了

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

有一个极端情况,如果用这个模板的话, 输入[2,1]这样的东西返回时需要这层后处理~

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 r;
    }
}