题意
同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;
}
};