问题导入
找出给定数组中局部峰值的角标,若有多个则任意返回一个即可。
一般求解
顺序遍历数组的每一个元素,找到某一个峰值立刻返回,是最容易想到的做法。
这种解法比较暴力,时间复杂度为O(N),代码并不是非常优雅。class Solution { public: int findPeakElement(vector<int>& nums) { int rtn; if (nums.size() == 1) return 0; else if (nums[0] > nums[1]) return 0; for (rtn = 1; rtn < nums.size(); rtn++) { if (nums[rtn] > nums[rtn-1] && nums[rtn] > nums[rtn+1]) return rtn; } return rtn-1; } };
检索优化
此题不需要额外的空间消耗,要想取得突破只能从查询的方式上改良。这样首先想到的自然是二分查找,该方法的时间复杂度仅为O(logN),性能得到了一定的优化。以下是二分查找的迭代实现:
class Solution { public: int findPeakElement(const vector<int> &num) { int low = 0; int high = num.size()-1; while(low < high) { int mid1 = (low+high)/2; int mid2 = mid1+1; if(num[mid1] < num[mid2]) low = mid2; else high = mid1; } return low; } };