和Search in Rotated Sorted Array这道题相比,变化在于数组中可能出现重复的元素。这就会导致pivot将重复的元素分到了数组的左右两端。 相比于1,本题需要多考虑一种情况,即A[l]==A[mid]。这种情况下,有可能l到mid全部相同,pivot出现在右半部分;也有可能pivot在l和mid之间,要想判断清楚,只有遍历。 因而,添加了重复元素这个条件的确会增加复杂度。
public class Solution {
public boolean search(int[] A, int target) {
int l=0,r=A.length-1;
while(l<r)
{
int mid = (l+r)/2;
if(A[mid]==target)
{
return true;
}
if(A[l]==A[mid])
{
for(int i=l;i<mid;i++ )
{
if(A[i]==target)
{
return true;
}
}
l = mid+1;
}
else if(A[l]<A[mid])
{
if(A[l]<=target&&target<A[mid])
{
r = mid-1;
}else
{
l = mid+1;
}
}
else
{
if(A[mid]<target&&target<=A[r])
{
l = mid+1;
}else
{
r = mid-1;
}
}
}
if(l==r&&A[l]==target)
{
return true;
}
return false;
}
}