Search Rotate Position in Sorted Array

public static int searchHelper(int[] arr, int left, int right) {
		if (left > right) {
			return -1;
		}
		
		int mid = left + (right - left) / 2;
		
		// 正常顺序, 一直找到左端
		if (mid == 0) {
			// 特殊情况, 只rotate一次,例如  5,1,2,3,4
			if (arr.length > 1 && arr[mid] > arr[mid + 1]) return 1;
			return 0;
		}
		
		// 逆序, 一直找到右端
		if (mid == arr.length - 1) {
			return arr.length;
		}
		
		// 找到 rotate 点的条件
		if (arr[mid] > arr[mid + 1] && arr[mid] >= arr[mid - 1]) {
			return mid + 1;
		}
		
		// 右边顺序正常,到左边找
		if (arr[mid] < arr[right]) {
			return searchHelper(arr, left, mid - 1);
		// 右边顺序不正常,到右边找
		} else if (arr[mid] > arr[right]) {
			return searchHelper(arr, mid + 1, right);
		// 特殊情况, 有 duplicate, 左右判断不出来,例如 {2,2,2,2,1,2,2}, 左右都找
		} else {
			int searchLeftResult = searchHelper(arr, left, mid - 1);
			int searchRightResult = searchHelper(arr, mid + 1, right);
			if (searchLeftResult == -1 && searchRightResult == -1) return -1;
			if (searchLeftResult != -1) return searchLeftResult;
			if (searchRightResult != -1) return searchRightResult;
			return -1;
		}
	}

	public static int searchRotatePosition(int[] arr) {
		return searchHelper(arr, 0, arr.length - 1);
	}


几个 test case:

A0 = {3,4,5,6,7,8,1,2}
A1 = {1,2,3,4,5,6,7}
A2 = {7,6,5,4,3,2,1}
A3 = {5,1,1,1,2,3,4}
A4 = {2,2,3,4,1,2,2}
A5 = {2,2,2,2,1,2,2}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值