Leetcode 162 寻找峰值(二分)
题目描述:
峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。要求时间复杂度为log(N)。
题解:
log(N)复杂度的算法一般都是要用到二分的,二分的核心是划分条件函数的设计。在这里,题面给出了假设 nums[-1] = nums[n] = -∞。那么nums[0]有一个递增的趋势,
nums[N-1]有一个递减的趋势。定义区间的左端点left,右端点right,如果nums[mid] < nums[mid+1],也就是中点有一个递增的趋势,那么在这个mid可以作为新的left(中点为递增,rigth为递减,那么峰值一定会出现在右区间);
如果nums[mid] > nums[mid+1],中点有一个递减的趋势,那么峰值出现在左区间。
AC代码:
class Solution { public: int findPeakElement(vector<int>& nums) { int Len = nums.size(); int l = 0; int r = Len-1; while(l<r) { int mid = (l+r)/2; if(nums[mid] < nums[mid+1]) l = mid+1; else r = mid; } return l; } };