给定一个数组,假设下标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的左边或者右边有比它大,那么就找大的那边就行。
这是我写的:
感觉略挫
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; } };
这是看到的比较好的:
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