LintCode-75: Find Peak Element

这题是binary search的经典题。
我们可以看A[mid]跟左右两个元素的比较,无非四种情况:

  1. 中间>左 && 中间>右,此为波峰,直接返回
  2. 中间>左 && 中间<右,切左边
  3. 中间<左 && 中间>右,切右边
  4. 中间<左 && 中间<右,切左切右都可。
    第4种情况可以与第1,2种合并。

代码如下:

    int findPeak(vector<int>& A) {
        int start=0, end=A.size()-1;
        while(start+1<end) {
            int mid=start+(end-start)/2;
            if (A[mid]>A[mid-1] && A[mid]>A[mid+1]) return mid;
            if (A[mid]<A[mid-1] && A[mid]>A[mid+1]) end=mid;
            else start=mid;
        }
        return A[start]>A[end]? start:end;
    }

二刷代码如下:

class Solution {
public:
    /**
     * @param A: An integers array.
     * @return: return any of peek positions.
     */
    int findPeak(vector<int> &A) {
        int n = A.size();
        if (n <= 1) return n - 1;
        
        int start = 0, end = n - 1;
        while(start + 1 < end) {
            int mid = start + (end - start) / 2;
           // if (mid == 0) return -1;
            if (A[mid] > A[mid - 1] && A[mid] > A[mid + 1]) return mid;

            if (A[mid - 1] < A[mid]) start = mid;
            else if (A[mid - 1] > A[mid]) end = mid;
        }
        
        return -1;
    }
};

三刷:

class Solution {
public:
    /**
     * @param a: An integers array.
     * @return: return any of peek positions.
     */
    int findPeak(vector<int> &a) {
        int len = a.size();
        int start = 0, end = len - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (a[mid] > a[mid - 1] ) {
                start = mid;
            } else {
                end = mid;
            }
        }
        if (a[end] > a[start]) return end;
        return start;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值