问题描述:
A peak element is an element that is greater than its neighbors.
Given an input array nums
, where nums[i] ≠ nums[i+1]
, find a peak element and return its index.
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that nums[-1] = nums[n] = -∞
.
Example 1:
Input: nums = [1,2,3,1]
Output: 2
Explanation: 3 is a peak element and your function should return the index number 2.
Example 2:
Input: nums = [
1,2,1,3,5,6,4]
Output: 1 or 5
Explanation: Your function can return either index number 1 where the peak element is 2,
or index number 5 where the peak element is 6.
Note:
Your solution should be in logarithmic complexity.
解题思路:
这道题一开始我想:从头到位遍历一遍比较一下不就找到了吗?直到我看到了要求:在logn的复杂度
说到logN,首先就会想到二分法。
那么二分法怎样才能应用到这道题目上呢?
去中间值没有问题,下一步该怎么做呢?
可以用中间的值nums[mid]去和右边的相邻的值nums[mid + 1]进行比较:
若nums[mid] < nums[mid + 1]: 说明在左半部分是一个上升的部分,那么峰值可能会出现
若nums[mid] > nums[mid+ 1]: 说明在包含mid的右半部分可能会有峰值出现
代码:
class Solution { public: int findPeakElement(vector<int>& nums) { int left = 0; int right = nums.size()-1; while(left < right){ int mid = (left + right) /2 ; if(nums[mid] < nums[mid+1]) left = mid + 1; else right = mid; } return right; } };
可参考资料:http://courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf