峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 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) 时间复杂度的。
C++1
二分查找法。
首先,判断当数组的长度为0的时候,直接返回-1
。
其次,当数组长度为1的时候,直接返回0就好了。
然后,使用二分法计算峰值的位置,从示例中可以看出,峰值是大于左右两边的值的,那么就以此作为判定条件,当计算中间下标的值小于右边值的时候,那么我们把此时的mid+1
的下标作为下次迭代的左下标,右下标不变;当中间值大于等于右边值的时候,我们把此中间下标mid
赋值为下次迭代的右下标,直到left==right
为止,跳出循环。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
long mid = 0, left = 0, right = nums.size()-1;
if(right == -1){
return -1;
}
if(right == 0){
return 0;
}
while(left < right){
mid = (left+right)/2; // 向下取整
if(nums[mid]<nums[mid+1]){
left = mid + 1;
}else{
right = mid;
}
}
return left;
}
};