LeetCode 162. 寻找峰值 (二分、递归迭代实现)

寻找峰值
思路:
根据一个点处在上下坡,来缩小搜索区间。

class Solution {
public:
    int findPeakElement(vector<int>& a) {
        int n = a.size();
        if(n==1) return 0;
        if(n==2) return a[0]>a[1]?0:1;
        int l = 0 ,r = (int)a.size()-1;
        while(l<=r){
            int m = l+(r-l)/2;
            if(m==0){
                if(a[m]>a[m+1]) return m;
                else l = m+1;
            }else if(m==n-1){
                if(a[m]>a[m-1]) return m;
                else r = m-1;
            }else{
                if(a[m]>a[m-1] && a[m]>a[m+1]) return m;
                else if(a[m-1]<a[m] && a[m]<a[m+1]){
                    l = m+1;
                }else{
                    r = m-1;
                }
            }
        }
        return -1;
    }
};

参考官方的:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        return search(nums,0,nums.size()-1);
    }
    int search(vector<int>& nums,int l,int r){
        if(l==r) return l;
        int mid = l+(r-l)/2;
        if(nums[mid]<nums[mid+1])
            return search(nums,mid+1,r); //右侧必然存在峰值
        return search(nums,l,mid);       //左侧必然存在峰值
    }
};

改写为迭代:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int l = 0 ,r = nums.size()-1;
        while(l<r){
            int mid = l+(r-l)/2;
            if(nums[mid]<nums[mid+1]){
                l = mid+1;
            }else{
                r = mid;
            }
        }
        return l;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107760872