您好,欢迎来到锐游网。
搜索
您的当前位置:首页LeetCode 33. 搜索旋转排序数组(Java版)

LeetCode 33. 搜索旋转排序数组(Java版)

来源:锐游网

题目

题解

题目的重点的就是有点被旋转了,而且时间复杂度 O ( l o g N ) O(logN) O(logN),所以这里需要运用的就是而二分思想的。
我们要知道数组的最小值所在的地方,一般来说在左半边还是右半边。
举个例子
1 最小值在左半边
low = 0high = len - 1,所以 high 是 8
mid = low + ((high - low) >> 1),此时mid 是 4;
如果此时的target 是10。

因为 nums[mid] < nums[low], 这里的最小值在数组的左半边,所以右边半的是完全的递增序列。所以只要判断这个值是否不是在递增里面,就可以根据这个判断来修改 lowhigh
此时mid 到high是递增序列,所以需要确认10 是不是在这个递增序列中,如果在,那么就是low = mid + 1
如果不是,那么high = mid+1

最小值在右半边

8 10 12 14 16 18 2 4 6

因为nums[mid] > nums[low], 这里的最小值在数组的右半边,所以这个 lowhigh 是递增。
此时 midlow 是递增序列,所以需要确认10 是不是在这个递增序列中,如果在,那么就是 high = mid - 1
如果不是,那么 low = mid + 1

public int search(int[] nums, int target) {
	if (nums == null || nums.length == 0) {
		return -1;
	}
	int len = nums.length;
	int low = 0;
	int high = len - 1;
	int mid = 0;
	//
	while (low <= high) {
		mid = low + ((high - low) >> 1);
		if (nums[mid] == target) {
			return mid;
		// 旋转点在右边,
		} else if (nums[low] <= nums[mid]) {
			// 左边都是递增的,在递增序列中。
			if (target >= nums[low] && target < nums[mid]) {
				high = mid - 1;
			} else {
				low = mid + 1;
			}
		// 旋转点在左边
		} else if (nums[low] > nums[mid]) {
			// 右边都是递增的,在递增序列中
			if (target <= nums[high] && target > nums[mid]) {
				low = mid + 1;
			} else {
				high = mid - 1;
			}
		}
	}
	return -1;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务