问题描述
Follow up for “Search in Rotated Sorted Array”:
What if duplicates are allowed?Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Write a function to determine if a given target is in the array.
The array may contain duplicates.
解决思路
同样是分而治之地查找,每次求一个中位数,然后判断出一个绝对的有序的部分进行二分查找,找到,则输出结果,否则继续查找不是有序的那部分。如果两部分都无法判断是否有序,则可以一个一个查找。代码
class Solution {
public:
bool search(vector<int>& nums, int target) {
if (nums.size() == 0)
return false;
return helper(nums,0,nums.size()-1,target) != -1;
}
int helper(vector<int>& nums,int l, int r, int target) {
if (l == r && nums[l] == target) {
return l;
} else if (l == r) {
return -1;
} else if (l > r) {
return -1;
}
if (nums[l] == target || nums[r] == target)
return 1;
if (nums[l] < nums[r]) {
int mid = (l+r)/2;
if (nums[mid] == target)
return mid;
else if (nums[mid] > target)
return helper(nums,l,mid-1,target);
else
return helper(nums,mid+1,r,target);
} else {
int mid = (l+r)/2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < nums[r]) {
int temp = helper(nums,mid+1,r,target);
if (temp != - 1)
return temp;
return helper(nums,l,mid-1,target);
} else if (nums[mid] > nums[l]) {
int temp = helper(nums,l,mid-1,target);
if (temp != -1)
return temp;
return helper(nums,mid+1,r,target);
} else {
int t1 = helper(nums,l,mid-1,target);
if (t1 != -1)
return t1;
t1 = helper(nums,mid+1,r,target);
return t1;
}
}
}
};