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)上进行了

搜索旋转排序数组--力扣

搜索旋转排序数组

33. 搜索旋转排序数组

搜索旋转排序数组