一、题目描述

二、解题思路
(1)解法一:暴力法
数组只有三种情况,单调递增(顶峰为首位),单调递减(顶峰为最后一位),不单调(顶峰在中间),处理完边界条件后,利用循环可以找到第一个峰值,即为所求。
(2)解法二:二分法
具有"二段性",可以使用二分法来解决这个问题。
如果nums[mid]<nums[mid+1],则mid+1到nums.size()-1的区间内一定有峰值,更新left=mid+1;
如果nums[mid]>nums[mid+1],则0到mid的区间内一定有峰值,更新right=mid;
三、代码实现
解法一:暴力法
时间复杂度:T(n)=O(n)
空间复杂度:S(n)=O(1)
cpp
class Solution {
public:
int findPeakElement(vector<int>& nums) {
//暴力法
//边界处理
if(nums.size()==1) return 0;
if(nums[0]>nums[1]) return 0;
if(nums[nums.size()-1]>nums[nums.size()-2]) return nums.size()-1;
int i;
for(i=1;i!=nums.size();i++){
if(nums[i-1]>nums[i])
break;
}
return i-1;
}
};
解法二:二分法
时间复杂度:T(n)=O(log2)
空间复杂度:S(n)=O(1)
cpp
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 if(nums[mid]<nums[mid+1]) left=mid+1;
}
return left;
}
};