leetcode 162 寻找峰值
一、题目描述
二、解题思路
(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)
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)
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;}
};