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.
这个题目和上一个rotated arrary 一样,但是可能会出来一种情况,让A[mid]和A[left]和A[right]不好比较大小:
有可能多出来的情况是:1 1 1 3 1
因此要把A[mid]==A[left] 情况单独拿出来。
下面一段分析是copy的别人的:
在有序数组中查询一个值,二分法是一个通用解法。
但是此题的对有序数组进行了一个操作,使得原有序数组分成了两个部分。
原有序数组
A[0] < A[1] < A[2] < A[3] < A[4] < ... < A[N - 1]
Rotated后:
A[i] < A[i + 1] < ... < A[N - 1] > A[0] < A[1] < ... < A[i - 1]
方法依旧采用二分,假设现在我们要在A[l] ... A[r]中查询target。
1.A[l] < A[r],说明A[l] < A[l + 1] < A[l + 2] < ... < A[r]是一个部分有序数组,可以直接采用二分查询;
2.A[l] > A[r],说明存在一个k,使得A[l]到A[k],A[k+1]到A[r]为两个有序数组,此时我们还是用二分处理:
假设:mid = (l + r) / 2
如果A[mid] == target,则找到了target,否则在A[l]到A[mid - 1]与A[mid + 1]到A[r]两个部分搜寻目标值。
class Solution {
public:
bool search(int A[], int n, int target) {
return my_binary_search(A,0,n-1,target);
}
private:
bool my_binary_search(int A[],int left,int right,int target);
};
bool Solution::my_binary_search(int A[],int left,int right,int target){
while (left<=right)
{
int mid=(left+right)/2;
if (A[mid]==target)
{
return true;
}
if (A[left]<A[mid])
{
if (A[left]<=target&&target<A[mid])
right=mid-1;
else
left=mid+1;
}
else if(A[left]>A[mid])
{
if (A[mid]<target&&target<=A[right])
left=mid+1;
else
right=mid-1;
}
else if (A[left]==A[mid])
{
left=left+1;
}
}
return false;
}