首页 > 代码库 > leetcode[162] Find Peak Element

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;        }    }

 

leetcode[162] Find Peak Element