LeetCode Find Peak Element

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

Note:

Your solution should be in logarithmic complexity.

解题思路:重点在于对数时间复杂度,想到二分查找,且只要找出一个即可。

  1.若数组只有一个数字,那么它就是峰值。

  2.如果数组只有2个数字,则比较一下大的为峰值。

  3.如果数组数字大于2,先判断峰值在不在最左和最右端点,如果不在,则进行二分查找,mid = (start + end)>>1;如果num[mid]恰好是峰值返回,否则num[mid]会是下面几种情况:a.处在下坡。   b.处在上坡     c.在最低点(可以看成前面任意一种情形)

    如果在下坡,那么在[start,mid]区间必有峰值,因为在start处是上升的,在mid处是下降的。其他情况同理。

class Solution {
public:
    int findPeak(vector<int> num,int start,int end)
    {
        int mid = (start + end)>>1; 
        if(num[mid]>num[mid+1] && num[mid]>num[mid-1])return mid;
        else if(num[mid]>num[mid+1])
        {
            return findPeak(num,start,mid);
        }
        else
            return findPeak(num,mid,end);
    }
    int findPeakElement(const vector<int> &num) {
        int len = num.size();
        if(len==1)return 0;
        if(num[0]>num[1])return 0;
        if(num[len-1]>num[len-2])return len-1;
        return findPeak(num,0,len-1);
    }
};

 

posted @ 2014-12-08 20:22  ElephantKing  阅读(133)  评论(0编辑  收藏  举报