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

题目:

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;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值