LeetCode--33. 搜索旋转排序数组【直接二分】

news/2025/1/21 2:42:47/

leetcode.cn/problems/search-in-rotated-sorted-array/" rel="nofollow">LeetCode-33.搜索旋转排序数组


前言

关于这道题,我最开始想把这个旋转数组还原回去,但是后来发现没有那么麻烦,直接二分即可,重点在于关于当前区间的有序判断,故来写一份题解来分享一下。

正文

首先我们看看题目要我们干什么,题目大意就是给定一个经过轮转的有序数组和一个target值,要我们找到这个target在数组中的下标,没有则返回-1.

既然有序,那么便能和二分扯上关系,但是这个数组经过了轮转,这就很有意思了,又要二分,又不是完全的有序,怎么解决呢?这需要我们利用这个数组的一些性质,对二分的每一步进行合理的条件判断。

首先第一步,我们通过(L + R) / 2找到的中间值所在的位置的判断,通过这个题目的意思我们可以知道,nums[0]一定大于所有的被旋转到右边的数,一定小于除了这些数字以外的所有数字,姑且可以把他看成是一个类二叉树的"根右左"遍历,这样主要是可以更好的理解

但并不是二叉排序树,这个懂得都懂

紧接着我来谈谈第一步怎么判断,如果 nums[mid] > nums[0] 的话,那么可以确定,mid 存在于这个根的右边,也就是大于 nums[0] 的值,也可以说成是在数组中, 0-mid 是严格递增的,

随后我们进行下一步判断,当 nums[mid] > nums[0] 的时候,此时我们需要缩小我们的查找范围,也就是改变L或者R的值,这也是一个问题,首先我们要想一想,mid是在哪一个区间里面?如何改变L会有什么影响?改变R会有什么影响?

此时如果我们仅仅根据 nums[mid]target 的大小关系直接进行判断肯定是不行的,于是,我们还需要加上一层target所在区间的判断,这个是跟第一步的判断类似

如果 target > nums[0] 那么说明下标为0的点到target这一区间的数字也是严格递增的,此时如果target值在[l, r]的左半区间,便可以直接将我们的 r 赋值为 mid - 1, 否则将 l 赋值为 mid + 1,为什么可以直接判断应该赋值为mid + 1呢?下面细说。

如果 0 ~ target 他并不是严格递增的区间,怎么办?这恰恰说明了target处于[l, r]的右半区间,因为此时 nums[mid] 他是处于中间位置的,并且处于有序区间上,那么target必然是在 nums[mid]的右边,于是乎我们便可以直接将 l 赋值为 mid + 1,其他的就正常判断就好了。


下面说说nums[0] > nums[mid]的情况

其实思路都是差不多的,此时仍需要判断target的位置,此时若target小于nums[0]那么则说明了target也不在严格递增的数组区间上,那么此时,如果target也在mid的右侧,则可以直接将 l 赋值为 mid + 1,否则,将 r 赋值为 mid - 1,这里思路和上面一致。

下面就是具体实现的代码【Golang】

func search(nums []int, target int) int {n := len(nums)l := 0r := n - 1var mid intfor l <= r {mid = (l + r) / 2if nums[mid] == target {return mid}if nums[0] <= nums[mid] {if nums[0] <= target && nums[mid] > target {r = mid - 1} else {l = mid + 1}} else {if nums[mid] < target && target < nums[0] {l = mid + 1} else {r = mid - 1}}}return -1
}

结语

这道题到这里就结束了,如果还是没明白,或者有什么问题,欢迎给我留言!


http://www.ppmy.cn/news/1564820.html

相关文章

基于oracle linux的 DBI/DBD 标准化安装文档

一、安装DBI DBI(Database Interface)是perl连接数据库的接口。其是perl连接数据库的最优 秀方法&#xff0c;他支持包括Orcale,Sybase,mysql,db2等绝大多数的数据库&#xff0c;下面将简要 介绍其安装方法。 1.1解压 tar -zxvf DBI-1.616_901.tar.gz 1.2安装依赖 yum ins…

week07_nlp文本分类任务

1、文本分类 使用场景 自定义任务类别 类别的定义方式是任意的 只要人能够基于文本能够判断&#xff0c;都可以作为分类类别 如&#xff1a; 垃圾邮件分类 对话、文章是否与汽车交易相关 文章风格是否与某作者风格一致 文章是否是机器生成 合同文本…

LINUX编译LibreOffice

安装依赖 sudo apt update sudo apt install -y build-essential nasm git-core gnupg flex bison gperf libx11-dev \ libxext-dev libxrender-dev libxt-dev libxslt1-dev libglu1-mesa-dev \ libcairo2-dev libharfbuzz-dev libnss3-dev libnspr4-dev \ autoconf automake …

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

MyBatis递归查询层级关系的树

之前做递归的时候写了那么多java代码发现根本不需要&#xff0c;直接sql就能搞定&#xff0c;直接上代码。 数据&#xff1a;根据parentId查出id&#xff0c;然后把id赋值给parentId&#xff0c;在查处原本parentId下面有哪些级别的数据。 实体类&#xff1a;这里关键是id&a…

Spring boot框架下的RocketMQ消息中间件

1. RocketMQ 基础概念 1.1 核心概念 以下是 RocketMQ 核心概念在 Spring Boot 的 Java 后端代码中的实际使用方式&#xff1a; Producer&#xff08;生产者&#xff09; 定义&#xff1a;Producer 是负责发送消息到 RocketMQ 的组件。它可以将消息发送到指定的 Topic。 实…

深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用

文章背景 在现代软件开发中&#xff0c;我们经常会接触到各种数据结构的概念&#xff0c;比如 Entity、VO&#xff08;Value Object&#xff09;、QO&#xff08;Query Object&#xff09;、DTO&#xff08;Data Transfer Object&#xff09;等。这些概念尽管看似相似&#xff…

【VRChat · 改模】Unity工程导入人物模型;并添加着色器教程;

一、Unity工程导入人物模型 1.创建一个新的工程文件&#xff08;使用 VRChat 官方的开发工具 VCC&#xff09; 不添加着色器的时候&#xff0c;模型是粉色的 2.导入人物模型 在工程文件的 Assets 目录下&#xff0c;创建一个新的目录&#xff0c;可以起名为你的模型的名字 …