题目大意:在有重复元素的递增旋转数组中,判断目标数字是否存在
分析:二分搜索。和leetcode33类似,leetcode33判断nums[left]和nums[mid]可以得出mid左侧还是右侧递增的结论,但由于这道题数组中包含重复元素,所以要多考虑一种情况,也就是nums[left]=nums[mid]时如何操作,此时判断不出有序区间,所以使得left加一,看看下一步是否能够判断。
代码:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int start = 0,end = nums.size() - 1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] == target){
return true;
}
//中间元素大于最左边元素则左部分为有序数组
else if(nums[mid] > nums[start]){
//目标位于左部分
if(target >= nums[start] && target < nums[mid]) end = mid - 1;
else start = mid + 1; //目标位于右部分
}
//中间元素小于最左边元素则右部分为有序数组
else if(nums[mid] < nums[start]){
//目标位于右部分
if(target <= nums[end] && target > nums[mid]) start = mid + 1;
else end = mid - 1; //目标位于左部分
}
//中间元素等于最左边元素则无法区分有序部分
else start++;
}
return false;
}
};