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

 

你可能感兴趣的:(LeetCode)