二分法寻找无序序列的峰值
首先考虑边界的情况
(1)当只有一个数,那就返回0;
(2)如果有两个数,看1是否大于0,大于返回1;
(3)看数组末尾两个数,是否存在size-1>size-2;如果是直接返回size-1;
然后开始二分
已经明确首尾是下降趋势,再看mid与mid+1;如果也是下降趋势,证明mid与R之间不会存在最大值;所以R左移,砍掉右边;反之亦然
代码:
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param nums int整型vector* @return int整型*/int findPeakElement(vector<int>& nums) {// write code hereif(nums.size()==1) return 0;if(nums.size()==2){if(nums[1]>nums[0]){return 1;}}if(nums[nums.size()-1]>nums[nums.size()-2]){return nums.size()-1;}int L = 0;int R = nums.size() - 1;int mid = 0;while (L < R) {mid = L + ((R - L) >> 1);if (nums[mid] > nums[mid + 1]) {R = mid;} else {L = mid + 1;}}return L;}
};