首页 > 其他分享 >LeetCode HOT 100:搜索旋转排序数组

LeetCode HOT 100:搜索旋转排序数组

时间:2022-12-10 14:56:13浏览次数:75  
标签:有序 target nums mid 旋转 HOT 数组 100 LeetCode

题目:33. 搜索旋转排序数组

题目描述:

一个整数数组,数组每个值都不相同,且该整数数组是一个被旋转过的数组。被旋转过的数组是指,由一个递增的数组,从某一个下标开始往后的元素,移到最开头。举个例子:数组[1, 3, 4, 5,7],假设从下标为2处开始旋转,得到旋转过的数组为[4, 5, 7, 1, 3],如果从下标0处开始旋转,那么相当于没有旋转,还是原数组。
本题能保证,给你的整数数组,一定是每个值都不相同,且一定是一个旋转过的数组。然后给你一个target的值,让你返回target值在数组中的下标,如果target不在数组中,返回-1。要求时间复杂度为O(logn)

步骤:

这题一看要求时间复杂度O(logn),想到使用二分法,但是二分法需要数组满足递增,这一题不满足。但是还是可以使用二分法,只不过思路稍微转变一下。
1、下标l0rn - 1,开始进行二分。取得两者中间下标mid,如果mid下标的值正好等于target,直接返回结果即可。
2、如果[l, mid]是有序数组,且 target值在[l, mid]范围上,则我们应该将搜索范围缩小至 [l, mid - 1],否则在[mid + 1, r]范围中寻找。
3、如果[mid, r]是有序数组,且 target值在[mid, r]范围上,则我们应该将搜索范围缩小至 [mid + 1, r],否则在[l, mid - 1]范围中寻找。

解释:

1、为什么本题可以使用二分法?二分法一般都需要数组有序。这个数组因为被旋转过,看似是无序的,其实是局部有序的。例如[4, 5, 7, 1, 3][4, 5, 7][1, 3]都是有序的,所以在某些有序范围内,可以进行二分。
2、为什么要判断[l, mid][mid, r]是否有序?因为只有有序了,才能进行范围缩小。而至于在有序范围中怎么缩小,上面的步骤23说得很清晰了。

代码:

	int N = nums.length;
        if (N == 0) return -1;
        if (N == 1) return nums[0] == target ? 0 : -1;

        int L = 0, R = N - 1;
        int M = 0;

        while (L <= R) {
            M = L + ((R - L) >> 1);
            if (nums[M] == target) return M;

            // [L, M]有序,说明[L, R]无序
            if (nums[L] <= nums[M]) {
                // target在[L, M]范围上,接下来左侧继续二分
                if (target >= nums[L] && target < nums[M]) {
                    R = M - 1;
                } else { // 去右侧二分
                    L = M + 1;
                }
            } else { // [L, M]无序,说明[M, R]有序
                if (target > nums[M] && target <= nums[R]) { // 如果[M, R]范围上包括了target,去右侧二分
                    L = M + 1;
                } else { // 去左侧二分
                    R = M - 1;
                }
            }
        }

        return -1;

标签:有序,target,nums,mid,旋转,HOT,数组,100,LeetCode
From: https://www.cnblogs.com/yuhang-wiki/p/16971580.html

相关文章

  • Leetcode 1691. 堆叠长方体的最大高度
    题目:给你n个长方体cuboids,其中第i个长方体的长宽高表示为cuboids[i]=[widthi,lengthi,heighti](下标从0开始)。请你从cuboids选出一个子集,并将它们堆叠起......
  • [LeetCode] 2049. Count Nodes With the Highest Score
    Thereisa binary treerootedat 0 consistingof n nodes.Thenodesarelabeledfrom 0 to n-1.Youaregivena 0-indexed integerarray parents r......
  • 8100视频中台如何对接报警信息
    1.配置视频中台信息推送地址  2.在对应业务系统中开发接受信息接口//接口地址自定义@RequestMapping(value=“/notifyVideoOnlineStatus”)publicResultEntityn......
  • leetcode_D7_70爬楼梯
    1.题目  2.解一  主要思路:自己的想法,内存和时间占用好像都不少。i为爬一个台阶的的个数,j为爬两个台阶的个数,通过循环计算出所有满足i*1+j*2==n的i和j,再对i和j......
  • 测试a100 torch 配合cuda 能否正常运行
    测试程序#-*-coding:utf-8-*-defgpu_test():"""python-c"importuutils;uutils.torch_uu.gpu_test()""""fromtorchimportTensorimp......
  • ahk autohotkey脚本 备份
    #NoEnv;RecommendedforperformanceandcompatibilitywithfutureAutoHotkeyreleases.;#Warn;Enablewarningstoassistwithdetectingcommonerrors.Se......
  • 【LeetCode】剑指 Offer 30. 包含min函数的栈
    题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路最初看到O(1)复杂度的时候......
  • #yyds干货盘点# LeetCode程序员面试金典:分割链表
    题目:给你一个链表的头节点 head​ 和一个特定值 x​ ,请你对链表进行分隔,使得所有 小于 x​ 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区......
  • LeetCode 3_无重复字符的最长子串
    LeetCode3:无重复字符的最长子串题目给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符......
  • 力扣 leetcode 1780. 判断一个数字是否可以表示成三的幂的和
    问题描述给你一个整数n,如果你可以将n表示成若干个不同的三的幂之和,请你返回true,否则请返回false。对于一个整数y,如果存在整数x满足y==3^x,我们称这个整数......