LeetCode HOT 100 —— 33.搜索旋转排序数组

news2025/7/12 9:27:26

题目

整数数组 nums 按升序排列,数组中的值 互不相同 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1],
nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7]
在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
在这里插入图片描述

思路

有序数组,立即推!—>二分查找,本题就是以二分搜索为基础

我第一次看完题目是懵逼的,我就想这题目想表达什么,在数组里搜索有没有这个数?

后来才明白,实际上就是给你一个旋转后的数组,让你实现一个时间复杂度为(log n)级别的搜索算法,能够在旋转后的数组上用二分法查找目标元素,即如何在非有序的数组中使用二分查找?

本题给出的nums数组是经过旋转过后的数组,并不是有序的,旋转之后只能保证数组局部是有序的,但是不妨碍继续使用二分查找

因为进行旋转之后,根据旋转点将数组分开的时候,一定有一部分是有序的,如示例数组为 [4,5,6,7,0,1,2] ,如果拿6来当旋转点,则旋转之后的数组被分成了两部分,分别为[4,5,6],[7,0,1,2],其中左边 [4, 5, 6] 这个部分的数组是有序的,其他也是如此

即算法的核心思路为:

将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环…即不停的二分,二分完接着二分,一分为二后,有序的使用二分查找法,无序的继续二分

即在二分查找时,可以查看当前mid(即数组的中间)为旋转点时,分割出来的两个部分[l,mid][mid+1,r]那个部分是有序的,并且根据有序的那个部分继续去改变二分查找的上下界,因为可以通过有序的那部分判断target在不在这部分中:

  • 如果[l,mid-1]是有序数组,即左边有序,且target的大小满足[nums[l],nums[mid])左闭右开,则应该将搜索范围缩小至[l,mid-1],否则在[mid + 1, r]中找
  • 如果[mid , r]是有序数组,且target大小满足(nums[mid+1],nums[r]],则应该将搜索范围缩小至[mid + 1, r],否则在[l, mid - 1]中寻找

这里举个例子:
如[4,5,6,7,0,1,2],mid = 3,即查看下标为3的位置为分割点,[l,mid-1]对应的数组值为[4,5,6],是有序的,以target = 5为例,target = 5满足这个范围,所以继续在这里面查找;以target = 2为例,target = 2不满足这个范围,即在[mid + 1, r]为[0,1,2]中寻找,此时已经是有序的了,可以直接用常规的二分
在这里插入图片描述

再如:[6,7,0,1,2,3,4,5],mid = 3 即查看下标为3的位置为分割点,,[l,mid-1]对应的数组值为[6,7,0],是无序的,所以看另一部分,[mid , r]对应的数组值为[1,2,4,5],是有序的,以target = 4为例,target = 4在这个范围内,可以继续查找;以target = 6为例,target = 6不满足这个范围,所以在[l,mid-1]里面找,即数组变成了[6,7,0],此时是无序的,继续找mid分成有序的和可能有序的两部分,继续二分…
在这里插入图片描述
java代码如下:

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;
        }
        // 1. 首先明白,旋转数组后,从中间划分,一定有一边是有序的。
        // 2. 由于一定有一边是有序的,所以根据有序的两个边界值来判断目标值在有序一边还是无序一边
        // 3. 这题找目标值,遇到目标值即返回
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = l + (r - l ) / 2;//防止溢出
            if (nums[mid] == target) {
                return mid;//如果找到target的话在这里返回最终结果,否则返回-1
            }
            if (nums[l] <= nums[mid]) {//如果左边有序
                if (target >= nums[l] && target < nums[mid]) {//且target的大小满足[nums[l],nums[mid]),左开右闭
                    r = mid - 1;//则应该将搜索范围缩小至[l,mid-1]
                } else {
                    l = mid + 1;//否则在[mid + 1, r]中找
                }
            } else {//如果右边有序
                if (target > nums[mid] && target <= nums[r]) {//且target大小满足(nums[mid+1],nums[r]]
                    l = mid + 1;//则应该将搜索范围缩小至[mid + 1, r]
                } else {//否则在[l, mid - 1]中寻找
                    r = mid - 1;
                }
            }
        }
        return -1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive之存储和压缩

Hive系列 第十章 存储和压缩 10.1 首先看一下Hadoop中的压缩 10.1.1 基本概念 1、概念 压缩是一种通过特定的算法来减小计算机文件大小的机制。这种机制是一种很方便的发明&#xff0c;尤其是对网络用户&#xff0c;因为它可以减小文件的字节总数&#xff0c;使文件能够通过…

Linux-yum

Linux下的开发工具即配置基本都要自己手动&#xff0c;和Windows一键式安装相比&#xff0c;Linux软件的安装要复杂很多。 centos 7下&#xff0c;基本的安装方式有三种&#xff1a; 1.源码安装——挺常用的&#xff0c;但是复杂&#xff0c;对初学者来说可以忽略。 2.rpm包安…

FFmpeg的makefile逻辑分析

在开始分析之前&#xff0c;讲一个 makefile 的调试技巧&#xff0c;推荐阅读《如何调试MAKEFILE变量》 make -f Makefile -f vars.mk HOSTPROGS这里我对 vars.mk 做了点修改&#xff0c;因为源 vars.mk 没处理特殊字符&#xff0c;直接 echo 会报错。ffmpeg 的 makefile 的变…

改进粒子滤波的无人机三维航迹预测方法附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

某公司常见题刷题笔记

LeetCode搞起来&#xff0c;虽说和实际业务没啥联系&#xff0c;但现在就卷起来了&#xff0c;没办法被迫卷起来。 1&#xff0c;滑动平均值&#xff0c;官网 给定窗口大小size&#xff0c;然后每次增加一个值value放入窗口&#xff0c;求此窗口内的平均值 class MovingAver…

李宏毅:Life Long Learning

Life Long Learing 也是continual Learning&#xff0c;也是incremental learning 目录 Life-Long Learning vs Transfer Learning Evaluation Research Directions Selective Synaptic Plasticity——Regulization Based Additional Neural Resourcr Allocation Memo…

Python简介-Python3及环境配置

Python简介 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越多被用于独立的、大型项目的开发。 Python语…

MFC的YUV播放器实现

MFC的YUV播放器实现 文章目录MFC的YUV播放器实现一、主要参考链接二、开发踩坑记录1、Gdiplus 绘图前置条件2、播放时点击滑竿能精准跳转3、鼠标悬停在滑竿上时显示预览小窗口本文记录使用MFC编写一个YUV播放器的过程&#xff0c;尽量实现播放器都有的常用功能。功能参考与网上…

四旋翼无人机学习第9节--OpenMV以及WIFI电路、供电电路再分析

文章目录0、参考与学习1、OpenMV插座电路2、OpenMV供电电路3、ESP8266电路分析3.0 绘制分享3.1 模块正面图3.2 模块背面图3.3 模块引脚介绍3.4 模块模式选择3.5 芯片手册参考电路4、供电电路分析4.1 电池接口与电源开关部分4.2 usb供电电路与电池电压降压电路4.3 5V降3.3V电路4…

[论文精度|博士论文]非结构环境下病虫害识别方法研究

概述 提出一种基于级联卷积神经网络的植物病害识别方法提出一种融合农田多源环境信息的害虫监测方法提出一种新的目标检测损失函数解决特征冲突问题 本文研究的主要方面在于特征提取。&#xff08;其他部分沿用目前最全面的公开数据和病虫害数据以及最先进的开源算法&#xf…

30岁之后身体还能像年轻的时候一样撸代码吗?

在IT圈流传着一句话&#xff0c;程序员吃的是青春饭。很多人认为&#xff0c;30岁是个阶段&#xff0c;在这个阶段后就需要往管理方向转型。因为在30岁之后身体再也不能像年轻的时候一样熬夜撸代码&#xff0c;而且继续从事一线开发的待遇也不如管理层优厚。至于转管理层失败的…

redis缓存一致性以及解决方案

一致性问题&#xff1a; 首先要到redis里面读取缓存&#xff0c;如果没有缓存&#xff0c;那么就到mysql里面去取数据&#xff0c;并且将其放置在缓存中 关于解决缓存一致性的问题&#xff0c;不难想到主要有两种解决方案&#xff0c;双更模式和删除模式 ** 双更模式&#xf…

【JVM】native关键字的使用

native关键字的使用一、JVM体系结构二、native是什么&#xff1f;三、native能干什么&#xff1f;四、native怎么使用&#xff1f;五、native总结在研读**《深入理解Java虚拟机》这本书时&#xff0c;看到 Java 虚拟机运行时数据区中有关本地方法栈**&#xff08;Native Method…

鲜花在线销售平台的设计与实现/鲜花商城/网上花店管理系统

摘 要 为了解决客户便捷地在网上购物&#xff0c;本文设计和开发了一个鲜花在线销售平台。本系统是基于web架构设计&#xff0c;SSM框架&#xff0c;javascript技术的前台页面设计与实现&#xff0c;使用Mysql数据库管理&#xff0c;综合采用java模式来完成系统的相关功能。主…

【GlobalMapper精品教程】028:栅格计算器的使用方法总结

文章目录 一、栅格计算器简介二、栅格计算器应用举例1. 归一化植被指数NDVI2. 归一化水体指数NDWI3. 归一化建筑指数NDBI一、栅格计算器简介 GlobalMapper中也提供了栅格计算器工具,可以方便的进行栅格计算、波段计算、指数计算等,使用方法有点儿像Envi软件。 用户可以使用系…

世界杯来了,让 Towhee 带你多语言「以文搜球」!

四年一度的世界杯已正式拉开战幕&#xff0c;各小组比赛正如火如荼地进行中。在这样一场球迷的盛宴中&#xff0c;不如让 Towhee 带你「以文搜球」&#xff0c;一览绿茵场上足球战将们的风采吧&#xff5e; 「以文搜球」是跨模态图文检索的一部分&#xff0c;如今最热门的跨模…

Leetcode刷题Day5休息 Day6----------哈希表

Leetcode刷题Day5休息 & Day6----------哈希表 1. 哈希表理论基础 数组、Set、Map 如果数据量小------------数组 如果数据量大------------Set 如果有Key、value------------Map 文章讲解&#xff1a;https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86…

【雷达检测】基于复杂环境下的雷达目标检测技术(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

数据之道读书笔记-06面向“自助消费”的数据服务建设

数据之道读书笔记-06面向“自助消费”的数据服务建设 数据底座建设的目标是更好地支撑数据消费&#xff0c;在完成数据的汇聚、整合、联接之后&#xff0c;还需要在供应侧确保用户更便捷、更安全地获取数据。一方面业务人员希望尽可能快速地获取各种所需的数据&#xff0c;另一…

基于双目相机拍摄图像的深度信息提取和目标测距matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB程序 1.算法描述 双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目&#xff0c;但我们见到的主流双目都是做成左右的。在左右双目的相机中&#xff0c;我们可以把两个相机都看作针…