题目:
峰值元素是指其值大于左右相邻值的元素。
给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
题解一:
首先我们直接想到的就是遍历一遍,找到大于左右的两个数直接返回其索引。因为需要遍历数组,所以此时的时间复杂度为O(n)。
代码一:
class Solution {
public:
int findPeakElement(vector<int>& nums) {
if(nums.size()==1) return 0;
int i;
for(i=0;i<nums.size();i++){
if(i==0){
if(nums[i]>nums[i+1]) return i;
}else if(i==nums.size()-1){
if(nums[i]>nums[i-1]) return i;
}else{
if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]) return i;
}
}
return 0;
}
};
题解二:
首先两个边界是负无穷,所以如果有两个相邻的数,如果左边的数大于右边的数,所以两个数的左边一定有峰值;如果左边的数小于右边的数,两个数的右边一定有峰值,以为两个边界是负无穷。(画一下数列分布图就能想到)。
代码二:
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left=0,right=nums.size()-1;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]>nums[mid+1]){
right=mid;
}else{
left=mid+1;
}
}
return left;
}
};