leetcode[162] Find Peak Element

给定一个数组,假设下标0左边的为负无穷,下标size的也为负无穷。找到峰值所在。

峰值是一定存在的,因为下标0大于左边了,如果不存在那么下标1就要大于0的,一次类推下一个都要大于上一个的。那么知道size-1的时候还是大于size-2,又因为size是负无穷,那么size-1就是峰值了。所以峰值一定存在。

最挫的就是:每个词和左右的比较,符合就输出下标。边界条件判断一下。大概比较2n次。

好一些的是:因为我们知道0下标的已经大于左边了那么只要从0开始往右找,找到大于右边的值就行了,那么就是判断n次就行。

class Solution {
public:
    int findPeakElement(const vector<int> &num) {
        for (int i = 0; i < num.size() - 1; i++)
        {
            if (num[i] > num[i+1])
                return i;
        }
        return num.size() - 1;
    }
};

 

最好的就是:二分法,如果mid的左边或者右边有比它大,那么就找大的那边就行。

这是我写的:

感觉略挫

class Solution {
public:
    int findPeakElement(const vector<int> &num) {
        int left = 0, right = num.size()-1, mid;
        if (num.size() == 1) return 0;
        
        while(left < right)
        {
            mid = (left + right)/2;
            if (mid == left && num[left] > num[right]) return left;
            else if (mid == left && num[left] < num[right]) return right;
            if (num[mid] > num[mid-1] && num[mid] > num[mid+1])
                return mid;
            else if (num[mid] < num[mid-1])
                right = mid - 1;
            else if (num[mid] < num[mid+1])
                left = mid + 1;
        }
        return left;
    }
};
View Code

这是看到的比较好的:

int findPeakElement(const vector<int> &num) {
        int left=0,right=num.size()-1;
        while(left<=right){
            if(left==right)
                return left;
            int mid=(left+right)/2;
            if(num[mid]<num[mid+1])
                left=mid+1;
            else
                right=mid;
        }
    }

 

2015/03/31:

c++ 二分:logn

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

python:On

class Solution:
    # @param num, a list of integer
    # @return an integer
    def findPeakElement(self, num):
        for i in range(1, len(num)):
            if num[i] < num[i-1]:
                return i-1
        return len(num)-1

 

posted on 2014-12-20 18:29  higerzhang  阅读(489)  评论(0编辑  收藏  举报