您的位置:首页 > 其它

LeetCode OJ算法题(八十一):Search in Rotated Sorted Array II

2014-08-27 14:43 232 查看
题目:

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.
解法:
和Search in Rotated Sort Array一样的思路,仍然可以利用折半查找。

但是在判断下一步是在前半段中查找还是后半段时会遇到麻烦。对于严格有序的数组来说,有两种形式:3,4,5,6,7,8,1,2以及7,8,1,2,3,4,5,6

他们的区别在于mid的左边是有没有rotate的转折点。判断依据可以由A[mid]与A[high]比较大小可知,如果A[mid]较小那么肯定是形式2,反之则是形式1。

但是对于非严格单调的数组,上述的判断不再成立,因为会出现1,1,1,1,1,3,1以及1,3,1,1,1,1,1,1,仅根据mid与high的比较不足以判断是哪种形式(用low也一样不能判断)

因此,对于A[mid] == A[high]的情况,我们只能对mid向后遍历,如果在high之前出现了不同于A[mid]的值,那么转折点在mid后,下一步应该查询后半段;如果high之前没有不同的值,那么属于情况2,下一步查询前半部。

可以看到,程序中会对mid到high之间进行遍历,这样在最糟的情况下(全部相同),性能会下降为O(n*log(n))

public class No81_SearchInRotatedSortedArrayII {
public static void main(String[] args){
System.out.println(search(new int[]{1,3,3,3,3}, 1));
}
public static boolean search(int[] A, int target) {
return searchWithIndex(A, target, 0, A.length-1);
}
public static boolean searchWithIndex(int[] A, int target, int low, int high){
if(low <= high){
int mid = (high-low)/2 + low;
if(target == A[mid])
return true;
if(target == A[low])
return true;
if(target == A[high])
return true;
if(A[mid] == A[high]){
int p = mid;
while(p < high && A[p] == A[mid]) p++;
if(A[p] == A[mid]) return searchWithIndex(A, target, low, mid-1);
//前半有序段超过了mid,且前半有序段全相等
return searchWithIndex(A, target, mid+1, high);
}
if((A[mid]>A[high] && (target<A[mid] && target > A[low])) ||
(A[mid]<A[high] && (target<A[mid] || (target>A[low] && target > A[high]))))
return searchWithIndex(A, target, low, mid-1);
else
return searchWithIndex(A, target, mid+1, high);
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息