题意
同Search in Rotated Sorted Array,只是数组中会有重复元素的出现。
思路
我们可以分析一下为什么和上一道题不同。
假设我们的原来的数组为:1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 5
现在我们在某一处交换成为:4, 4, 4, 4, 4, 4, 5, 1, 2, 3, 4。
现在我们 am=4,ar=4 ,并没有能力去判断右边是否是有序的。于是只有r–直到 am≠ar 。
如果数组为若干个1,某一处有一个0的时候,时间最坏会退化到 O(n) 。
代码
class Solution {
public:
bool search(vector<int>& a, int k) {
int n = a.size();
int l = 0, r = n - 1, m;
while (l <= r) {
m = l + (r - l >> 1);
if (a[m] == k) return true;
if (a[m] == a[r]) r--;
else {
if (a[m] < a[r]) {
if (a[r] == k) return true;
else {
if (a[m] < k && k < a[r]) l = m + 1;
else r = m - 1;
}
} else {
if (a[l] == k) return true;
else {
if (a[l] < k && k < a[m]) r = m - 1;
else l = m + 1;
}
}
}
}
return false;
}
};

本文介绍了一种在含有重复元素的旋转有序数组中查找特定值的方法。通过调整二分搜索算法来适应这种特殊情况,解决了因重复元素导致普通二分搜索失效的问题。
423

被折叠的 条评论
为什么被折叠?



