题目描述
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。
示例 1:
输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。
示例 2:
输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。
说明:
你的解法应该是 O(logN) 时间复杂度的。
题解1
题目要求只需返回其中的任意一个峰值的下标即可。
数组中不存在重复的元素,序列是由多个上升下降序列交替组成。
具体题解见这。
代码1
/*
没有重复的元素,序列是由上升和下降的序列构成的
时间复杂度为:O(logn)
空间复杂度为:O(1)
*/
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int len = nums.size();
int beg = 0, end = len - 1, mid;
while(beg < end){
mid = (beg + end) >> 1;
if(nums[mid] > nums[mid + 1]){//处于大致下降序列,峰值在左侧,可能为mid
end = mid;
}
else{//处于大致上升序列,峰值在右侧,可能为mid+1
beg = mid + 1;
}
}
return beg;
}
};