leetcode 162. Find Peak Element
题目描述
如果nums[i-1]<nums[i]并且nums[i]>nums[i+1],那么nums[i]就是峰值。除此情况之外,nums[i-1]和nums[i+1]至少有一个大于nums[i],因为题目已经保证相邻的元素不相等。坚持向上坡方向走一定能达到一个峰值,如果往两边走都是上坡,那就随意向两边选一个方向走。
class Solution {
public:int findPeakElement(vector<int>& nums) {int left = 0;int right = nums.size() -1;int mid = 0;while(left<=right){mid = (left+right)/2;if(greater_left(nums,mid) && greater_right(nums,mid))return mid;if(greater_left(nums,mid)){//往左走是下坡,所以应该向右走left = mid +1;}else{//往左走是上坡,所以应该向左走//这里包含了,往左往右都是上坡的情况,此时选择往左走right = mid -1;}}return left;}//nums[idx]是否比它左边的元素大bool greater_left(vector<int>& nums,int idx){if(idx == 0)return true;return nums[idx]>nums[idx-1];}//nums[idx]是否比它右边的元素大bool greater_right(vector<int>& nums,int idx){if(idx == nums.size() -1)return true;return nums[idx]>nums[idx+1];}
};