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.
有重复的时候要注意mid和high相同的情况。其他和search in rotated sorted array I 相同。
1.mid和high相同存在两种情况,比如1,1,3,1和1,3,1,1,不能因为mid和high一样就直接将high = mid - 1,有可能是1,1,3,1这种情况,此时将high--再进行判断。
2.该题中不能只用A[low] > A[high]来判断无序,应该用A[low] >= A[high]。
Source1
public class Solution {
public boolean search(int[] A, int target) {
int low = 0, high = A.length - 1;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(target < A[mid]){
if(A[low] >= A[high] && A[mid] >= A[high] && target <= A[high]){
if(A[mid] == A[high])
high --;
else low = mid + 1;
}
else high = mid - 1;
}
else if(target > A[mid]){
if(A[low] >= A[high] && A[mid] <= A[high] && target > A[high]){
if(A[mid] == A[high])
high --;
else high = mid - 1;
}
else low = mid + 1;
}
else return true;
}
return false;
}
}
Test
public static void main(String[] args){
int[] A = {1,3,1,1,1};
System.out.println(new Solution().search(A, 3));
}
用search in rotated sorted array I 的source2方法直接就可以通过
Source2
public boolean search(int[] A, int target) {
int low = 0, high = A.length - 1;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(target == A[mid]) return true;
if(A[low] < A[mid]){ //左半部有序
if(A[low] <= target && target < A[mid]){
high = mid - 1;
}
else low = mid + 1;
}
else if(A[low] > A[mid]){ //右半有序
if(A[high] >= target && target > A[mid]){
low = mid + 1;
}
else high = mid - 1;
}
else low ++; // A[low] == A[mid] 只有两种情况 要么该局部区间一个值 要么该局部区间两个值
}
return false;
}