https://leetcode.com/problems/find-peak-element/
1. Use linear search:
//4 ms 6.4 MBclass Solution {public:int findPeakElement(vector<int>& nums) {for(int i = 0; i < nums.size() - 1; i++){if(nums[i] > nums[i + 1])return i;}return nums.size() - 1;}};
2. Use binary search:
//8 ms 9 MB
class Solution {
public:
int findPeakElement(vector<int>& nums) {
if(nums.size() == 1)
return 0;
int peak;
peak = findPeak(nums, 0, nums.size()-1);
return peak;
}
private:
int findPeak(vector<int>& nums, int l, int r) {
if(l>r)
return -1;
int m = l + (r-l) / 2;
if(m > 0 && m < nums.size() - 1){
if((nums[m-1] < nums[m]) && (nums[m+1] < nums[m])){
return m;
}
}
else if(m == 0){
if(nums[m+1] < nums[m]){
return m;
}
}
else if(m == nums.size() - 1){
if(nums[m-1] < nums[m]){
return m;
}
}
return max(findPeak(nums, l, m-1), findPeak(nums, m+1, r));
}
};
OR
//4 ms 6.6 MB
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while(l < r){
int median = l + (r - l) / 2;
if(nums[median] > nums[median + 1])
r = median;
else
l = median + 1;
}
return l;
}
};
