思路类似于Leetcode33.Search_In_Rotated_Sorted_Array,区别在于对重复的处理。当中间数字与首/尾数字相同时,我们无法确定哪边是有序的(1111231和1231111)。当首/尾重复时则将首/尾向后/前移一位直到不重复为止。
时间复杂度:O(N)(当数组全部为重复的数字时,出现此最坏上界)
C++代码:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int st = 0, en = nums.size() - 1;
while (st <= en)
{
int mid = (st + en) >> 1;
if (nums[mid] == target)
return true;
if (nums[st] == target)
return true;
if (nums[en] == target)
return true;
if (nums[mid] < nums[en])
{
if (target > nums[mid] && target < nums[en])
st = mid + 1;
else
en = mid - 1;
}
else if (nums[mid] > nums[en])
{
if (target > nums[st] && target < nums[mid])
en = mid - 1;
else
st = mid + 1;
}
else
--en;
}
return false;
}
};