题目大意:本题是Search in Rotated Sorted Array的扩展,就是考虑数组中存在相等的情况。
理解:1)Search in Rotated Sorted Array(http://blog.csdn.net/blog_szhao/article/details/24522763)一题中没有重复的元素,这样各种情况都可以明确定义,但本题存在重复的元素,则不能简单跟之前一样;
2)[1,2,1,1,1]这种情况就是无法确定的情况,此时只能两边都查找一遍才可以确定。
实现:
public class Solution {
public boolean find(int[] a, int target, int low, int high) {
if(low > high) return false;
int mid = (low + high) >> 1;
if(a[mid] == target) return true;
if(a[mid] == a[high] && a[mid] == a[low]) { // [1,2,1,1,1]无法进行判断的情况
return find(a, target, low, mid - 1) || find(a, target, mid + 1, high);
}
else if(a[mid] < a[low] && a[mid] <= a[high]) { // [4,5,1,2,3,3]
if(target > a[mid] && target <= a[high]) return find(a, target, mid + 1, high);
else return find(a, target, low, mid - 1);
}
else {// if(a[mid] >= a[low] && a[mid] > a[high]) { // [3,4,4,5,1,2]
if(target < a[mid] && target >= a[low]) return find(a, target, low, mid - 1);
else return find(a, target, mid + 1, high);
}
}
public boolean search(int[] A, int target) {
if(A == null || A.length == 0) return false;
int len = A.length;
if(len == 1) {
if(A[0] == target) return true;
else return false;
}
return find(A, target, 0, len - 1);
}
}