https://leetcode.com/problems/find-peak-element/
A peak element is an element that is greater than its neighbors.
Given an input array
nums
, wherenums[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.
线性方法:
很直观,直接遍历寻找不满足单调性的位置
class Solution {
public:
int findPeakElement(vector<int>& nums) {
for(int i = 1; i < nums.size(); ++i){
if(nums[i] > nums[i-1]) continue;
else return i-1;
}
return nums.size()-1;
}
};
对数方法:
要求是对数时间,又是查找,考虑的就是二分查找。类比普通的二分查找,这道题的二分不变性就应该是“peak点始终保持在搜索区间内”
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int lo = 0;
int hi = nums.size()-1;
int mid;
while(lo < hi){
mid = (lo+hi)/2;
if(nums[mid] < nums[mid+1]) lo = mid+1;
else hi = mid;
}
return lo;
}
};