您的位置:首页 > 其它

算法设计周记(九)--二分查找

2017-11-06 20:13 375 查看

问题导入



找出给定数组中局部峰值的角标,若有多个则任意返回一个即可。

一般求解

顺序遍历数组的每一个元素,找到某一个峰值立刻返回,是最容易想到的做法。

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(N),代码并不是非常优雅。

检索优化

此题不需要额外的空间消耗,要想取得突破只能从查询的方式上改良。这样首先想到的自然是二分查找,该方法的时间复杂度仅为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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: