1、描述
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
示例 1:
输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-peak-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
有序,时间复杂度logN
峰值
3、思路
肯定是二分,
4、notes
处理好边界,
就是while(l <= R)
内部再处理好,
5、复杂度
时间;log(N)
空间:O(1)
6、code
// 别人写的
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while(l < r){
int m = (l+r) / 2;
nums[m] < nums[m+1] ? l = m + 1 : r = m;
}
return l;
}
};
// 自己写的
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n = nums.size();
int l = 0;
int r = n - 1;
if(n == 1) return 0;
while(l <= r){ // 这里如果写 < 就不能都通过,
int mid = l + ((r - l)>>1);
if(mid+1 == n && nums[mid]>nums[mid - 1]){ // 最右边的边界条件,
return mid;
}
if(mid == 0 && nums[mid]> nums[mid + 1]){ // 最左边的边界条件
return mid;
}
if((mid+1 < n)&&nums[mid]>nums[mid+1] && (mid - 1 >= 0)&& nums[mid] > nums[mid - 1]){
return mid; // 最大值在中间,
}
else if(nums[mid]>nums[mid+1] ){ // 最大值在左边,
r = mid - 1;
}
else{
l = mid + 1;
}
}
return 0;
}
};