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)

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;
    }
};