Hot10033. 搜索旋转排序数组
Posted 王六六的IT日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hot10033. 搜索旋转排序数组相关的知识,希望对你有一定的参考价值。
33. 搜索旋转排序数组
中等题
但凡是从有序序列中找某个数,第一反应 应该是「二分」。
一个原本有序的数组在某个点上进行了旋转,其实就是将原本一段升序的数组分为了两段。
「二分」的本质是两段性,并非单调性。只要一段满足某个性质,另外一段不满足某个性质,就可以用「二分」。
经过旋转的数组,显然前半段满足 >= nums[0],而后半段不满足 >= nums[0]。我们可以以此作为依据,通过「二分」找到旋转点。
class Solution
public int search(int[] nums, int target)
//数组长度
int n = nums.length;
//数组中无元素
if (n == 0)
return -1;
//数组中有一个元素
if (n == 1)
return nums[0] == target ? 0 : -1;
//定义二分查找的左右边界
int l = 0, r = n - 1;
while (l <= r)
int mid = (l + r) / 2;
if (nums[mid] == target)
return mid;
if (nums[0] <= nums[mid])
//如果target在[l,mid]内一直缩小右边界
if (nums[0] <= target && target < nums[mid])
r = mid - 1;
else // target<nums[0] ,target>nums[mid] 不在[l,mid]区间内,往右找
l = mid + 1;
else //nums[0] > nums[mid] [5,6,0,1,2,3,4]
if (nums[mid] < target && target <= nums[n - 1])
l = mid + 1;
else
r = mid - 1;
return -1;
以上是关于Hot10033. 搜索旋转排序数组的主要内容,如果未能解决你的问题,请参考以下文章
2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成
2021-09-26:搜索旋转排序数组。整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了