题目
33. 搜索旋转排序数组
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TXKHuWlS-1574951000373)(index_files/714bfc9a-fcd3-4570-9287-2624ca05a1df.png)]](https://i-blog.csdnimg.cn/blog_migrate/94447ee087eaed909e7e7e19efd19b11.png)
题解
题目的重点的就是有点被旋转了,而且时间复杂度
O
(
l
o
g
N
)
O(logN)
O(logN),所以这里需要运用的就是而二分思想的。
我们要知道数组的最小值所在的地方,一般来说在左半边还是右半边。
举个例子
1 最小值在左半边
low = 0, high = len - 1,所以 high 是 8
mid = low + ((high - low) >> 1),此时mid 是 4;
如果此时的target 是10。
16 18 2 4 6 8 10 12 14
因为 nums[mid] < nums[low], 这里的最小值在数组的左半边,所以右边半的是完全的递增序列。所以只要判断这个值是否不是在递增里面,就可以根据这个判断来修改 low 和 high 值
此时mid 到high是递增序列,所以需要确认10 是不是在这个递增序列中,如果在,那么就是low = mid + 1
如果不是,那么high = mid+1
最小值在右半边
8 10 12 14 16 18 2 4 6
因为nums[mid] > nums[low], 这里的最小值在数组的右半边,所以这个 low 到 high 是递增。
此时 mid 到 low 是递增序列,所以需要确认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;
}

本文介绍了一种在旋转排序数组中查找目标值的高效算法。利用二分搜索思想,通过比较中间元素与数组两端元素的关系,确定目标值可能存在的递增子序列区间,从而在O(logN)的时间复杂度内完成搜索。
820

被折叠的 条评论
为什么被折叠?



