【Leetcode】Search in Rotated Sorted Array

这道题让在旋转数组中找目标值,所以思路应该是在排好序的序列中进行二分查找

先给出代码,再逐块解析

	public int search(int[] A, int target) {
		if (A == null || A.length == 0) {
			return -1;
		}
		int left = 0;
		int right = A.length - 1;
		while (left <= right) {
			int middle = (left + right) / 2;

			if (A[middle] == target)
				return middle;

			if (A[left] < A[middle]) {
				if (target >= A[left] && A[middle] >= target)
					right = middle - 1;
				else
					left = middle + 1;
			} else if (A[left] > A[middle]) {
				if (target >= A[middle] && A[right] >= target)
					left = middle + 1;
				else
					right = middle - 1;
			} else
				left++;
		}
		return -1;
	}


前面和二分查找思路一样,如果找到,返回middle

如果没找到就要分三种情况了,一种情况是left~middle是排好序的,一种情况是left~middle没排好序(如果不出现重复,middle~right一定是排好序的),还有一种是left和middle指针重合(详见边界问题分析

如果是第一种情况,判断目标值是否在排好序的序列范围内,如果是,跳进这个序列,否则,跳到另一个序列去。

			if (A[left] < A[middle]) {
				if (target >= A[left] && target <= A[middle])
					right = middle - 1;
				else
					left = middle + 1;
			}


如果是第二种情况,判断目标值是否在排好序的序列范围内,如果是,跳进这个序列,否则,跳到另一个序列去。

			else if (A[left] > A[middle]) {
				if (target >= A[middle] && target <= A[right])
					left = middle + 1;
				else
					right = middle - 1;
			}

如果是第三种情况,直接left++就可以了。


边界情况分析

【9,1】

如果left指针和middle指针重合且target不在left和middle中。left=middle+1

如果left指针和right指针重合,此时不应该跳出循环,因为middle=left=right=(left+right)/2

直接返回A[middle],因为这个时候已经找到目标值。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值