首页 > 代码库 > 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; }};
这是看到的比较好的:
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。