题目:
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
跟着有序数组翻转后的查找 ,如果数组有重复怎么办?
这会影响时间复杂度吗?为什么以及如何影响的?写一个函数判断给定的数target是否在数组中。
思路:
上一题的思路是这样的:“本题依然使用二分法,难点在于如何判断 target 在前半段还是后半段。对于无重复的数组4 5 6 7 0 1 2,如果满足 A[begin] <= A[mid] ,即数组的第一个值小于中间值 4 <7 ,那么可以断定前半段数组有序。如果不满足这个条件,(比如:4 5 0 1 2) 则说明后半段有序。因为把这个数组从中间分开后,一定至少有半个数组是有序的。然后再判断 target 是否在有序的半段中(这个很好判断),如果在,则相当于在有序数组中查找,很简单。如果不在有序的那半段,则一定在另外半段里。然后使用迭代即可把target找出。”
对于本题,由于可以有重复,则不能判断一定有半段是有序的。比如:1 3 1 1 1 。当然,如果满足 A[begin] < A[mid] ,还是说明前半段有序,如果满足 A[begin] > A[mid] 说明后半段有序(也有可能后半段全部相等)。如果满足 A[begin] = A[mid] ,就不好判断了,这时可以让 begin+1,不考虑在前半段还是后半段,而是对所有后面的继续判断(这时候就会影响时间复杂度)。比如(3,1)中查找1的这种。
代码:
class Solution {
public:
bool search(int A[], int n, int target)
{
int begin = 0 ;
int end = n - 1;
while(begin <= end)
{
int mid = (begin + end)/2;
if(A[mid] == target)
{
return true;
}
else
if(A[begin] < A[mid])
{
if(A[begin] <= target && target < A[mid])
{
end = mid - 1;
}
else
{
begin = mid + 1;
}
}
else
if(A[begin] > A[mid])
{
if(A[mid] < target && target <= A[end])
{
begin = mid + 1;
}
else
{
end = mid - 1;
}
}
else
begin++;
}
return false;
}
};