【CT】LeetCode手撕—33. 搜索旋转排序数组

目录

  • 题目
  • 1-思路
    • 1-1 模式识别:
    • 1-2 二分模板 && 本质
      • 二分红色边界
      • 二分绿色边界
    • 1-3 本题思路
      • ①二分出第一个区间
      • ②判断 target 在哪个区间
      • ③利用二分性质
  • 2- 实现
    • ⭐33. 搜索旋转排序数组——题解思路
  • 3- ACM实现

题目

  • 原题连接:33. 搜索旋转排序数组
  • 参考视频:B站教学视频

1-思路

1-1 模式识别:

  • 模式1 ——>**O(log n)**:使用 O(log n) 时间复杂度算法查找到目标值,因此想到的算法是二分算法。
  • 模式2 ——> 旋转数组:旋转数组无法通过一次二分找到目标值,因此需要两次二分。

1-2 二分模板 && 本质

  • 根据二分查找的过程,二分模板分两种情况。
    • 一种是二分出 红色边界 target / x ,条件为q[mid]<=x ——> mid = (l+r+1)/2
    • 一种是二分出 绿色边界 target / x ,条件为q[mid]>=x——> mid = (l+r)/2

image.png

二分红色边界

  • 结果收集 r
while(l<r){int mid = (l+1+r)/2;if(q[mid]<=x) l=mid;else r = mid-1;
}

二分绿色边界

  • 结果收集 l
while(l<r){int mid = (l+r)/2;if(q[mid]>=x) r=mid;else l = mid+1;
}
  • 二分的本质在于让 二分的区间满足一个性质。

1-3 本题思路

  • 本题提供的旋转数组的分布如下,因此需要分别使用两次二分

image.png

①二分出第一个区间

    1. 答案区间 l = 0, r = nums.length-1
    1. 利用二分性质,使得 前半段的性质 满足 nums[mid] >= nums[0],二分出旋转点
    1. 区间划分
    • 若满足 nums[mid] >= nums[0] 此时 答案肯定在 [mid,r]
    • 否则答案在 [0,mid-1] 中,因为是 r = mid-1 ,此时 mid 初始化为 mid=(l+r+1)/2
    // 1. 第一次二分找出 分界点// 二分本质,找到前半段 满足 nums[mid] >= nums[0]int l = 0,r = nums.length-1;while(l<r){int mid = (l+r+1)/2;if(nums[mid] > nums[0]) {l = mid;}else {r = mid-1;}}

②判断 target 在哪个区间

    // 2.判断二次二分边界if(target >= nums[0]) {l = 0;}else {l=r+1 ;r = nums.length-1;}

③利用二分性质

        // 3.第二次二分while(l<r){int mid = (l+r+1)/2;if(nums[mid]<=target) l=mid;else r = mid-1;}return nums[r] == target ? r:-1;

2- 实现

⭐33. 搜索旋转排序数组——题解思路

:::info

  • 1. 利用二分性质,二分出分界点
    • 二分本质是使得一个区间满足性质
    • 首次二分使得 **nums[mid]** 满足 **nums[mid]>=nums[0]** 的性质
    • **if(nums[mid] >= nums[0])** 此时 结果在 **[mid,r]** 因此 ——> **l = mid**
    • 否则 r = mid-1 ,根据判断 **mid =(l+r+1)/2**
  • 2. 利用边界找出二次二分边界
    • **if(target >= nums[0]) ——> l = 0;**
    • **else l = mid+1; r = nums.length-1**
  • 3. 二次二分
    • 利用二分红色边界模板
      :::
class Solution {public int search(int[] nums, int target) {// 1. 第一次二分找出 分界点// 二分本质,找到前半段 满足 nums[mid] >= nums[0]int l = 0,r = nums.length-1;while(l<r){int mid = (l+r+1)/2;if(nums[mid] > nums[0]) {l = mid;}else {r = mid-1;}}// 2.判断二次二分边界if(target >= nums[0]) {l = 0;}else {l=r+1 ;r = nums.length-1;}// 3.第二次二分while(l<r){int mid = (l+r+1)/2;if(nums[mid]<=target) l=mid;else r = mid-1;}return nums[r] == target ? r:-1;}
}

3- ACM实现

public class findTraversalNums {public static int findT(int[] nums,int target){int l = 0 , r = nums.length;// 1.首次二分while(l<r){int mid = (l+r+1)/2;if(nums[mid] >= nums[0]) l=mid;else r=mid-1;}// 2. 划分区间if(target >= nums[0]) l = 0;else{l = r+1;r = nums.length-1;}// 2.二次二分while(l<r){int mid = (l+r+1)/2;if(nums[mid] <= target){l = mid;}else{r = mid-1;}}return target == nums[r] ? r:-1;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入旋转数组长度");int n = sc.nextInt();int[] nums = new int[n];for(int i = 0 ; i < n;i++){nums[i] = sc.nextInt();}System.out.println("输入目标值");int target = sc.nextInt();System.out.println("目标下标为"+findT(nums,target));}
}

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

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

相关文章

MathTpye7最新版软件下载与安装步骤2024最新新手小白教程

在2024年&#xff0c;作为软件开发者的你&#xff0c;一定知道MathType这款广受欢迎的数学公式编辑器吧&#xff01;&#x1f4f1;&#x1f50b;&#x1f4b0;&#x1f9ee; MathType是一款功能强大的数学公式编辑工具。无论是学术研究&#x1f4da;还是数字教育&#x1f469;‍…

火车头采集怎么使用GPT等AI原创文章

火车头采集官方并没有GPT、百度文心一言AI、阿里通义千问AI、Kimi大模型等AI功能&#xff0c;但支持接入插件&#xff0c;可以编写相应人工智能AI原创文章插件&#xff08;火车头采集支持PHP和c#这2种语言的插件编写&#xff09;&#xff0c;或者导入第三方封装好的GPT等AI原创…

【收藏】Web 前端知识体系精简【文末福利!】赠2024Web 前端/安全工程师资料视频教程+源码+课件

目录 JAVASCRIPT 篇 0、基础语法 1、函数原型链 2、函数作用域 3、函数指针 this 4、构造函数 new 5、闭包 6、单线程和异步队列 7、异步通讯 Ajax技术 8、DOM对象 document 9、事件系统 Event 10、全局对象 window CSS 篇 1、选择器 2、定位 3、浮动 4、盒子…

人脸识别系统---人脸对比

一、人脸对比 1.定义全局变量来存储选择的图片路径和标签 save_image1 None save_image2 None image_label1 None image_label2 None2.定义了一个名为compare_faces的函数&#xff0c;用于比较两张图片中的人脸是否相似 def compare_faces():if save_image1 and save_im…

远程开发端口转发

应用推荐场景&#xff1a; 1.服务器跑后台&#xff0c;本地出前端应用。 比如Stable Diffusion的大模型打标应用。 2.Docker容器服务器。 对于本地服务想要转出去&#xff0c;跑出来前端。该项能克服虚拟机的端口与ip访问问题。 正文&#xff1a; 涉及的软件&#xff1a; …

二级造价师精选基础知识题库(含答案)

一.单项选择题: 1.大中型建设工程项目立项批准后&#xff0c;在工程开工前&#xff0c;应当由( )按照有关规定申请领取施工许可证。A.建设单位 B.施工单位 C.总承包单位 D.监理单位 2.建设单位申领建筑工程施工许可证后&#xff0c;既不开工又不申请延期或者超过延期时限的&a…

14,15-EET/DHET Hypertension ELISA Kit--Detroit RD

用于14,15-EET/DHET测量的DH2与用于14,15-DHET测量的DH1相同。与DH2相比&#xff0c;与DH1的唯一区别是样品制备步骤&#xff08;而不是Elisa试剂盒&#xff09;&#xff0c;其中EET被化学改为DHET。 货号&#xff1a;DH2 名称&#xff1a;14,15-EET/DHET Hypertension ELISA…

C#——值类型和引用类型的区别详情

值类型和引用类型的区别 值类型 值类型&#xff1a; 常用的基本数据类型都是值类型&#xff1a;bool 、char、int、 double、 float、long 、 byte 、ulong、uint、枚举类型、 结构体类型等特点: 在赋值的过程当中&#xff0c;把值的本身赋值给另一个变量&#xff0c;再修改…

使用 PNPM 从零搭建 Monorepo,测试组件并发布

1 目标 通过 PNPM 创建一个 monorepo&#xff08;多个项目在一个代码仓库&#xff09;项目&#xff0c;形成一个通用的仓库模板。 这里以在该 monorepo 项目中搭建 web components 类型的组件库为例&#xff0c;介绍从仓库搭建、组件测试到组件发布的整个流程。 这个仓库既可…

gpt、llama大模型模型结构细节探索

参考&#xff1a; https://github.com/naklecha/llama3-from-scratch&#xff08;一定要看看&#xff09; https://github.com/karpathy/build-nanogpt/blob/master/play.ipynb 视频&#xff1a; https://www.youtube.com/watch?vl8pRSuU81PU https://tiktokenizer.vercel…

SiLM59xx系列SiLM5932SHOCG-DG 一款支持主动短路保护功能(ASC)单通道隔离驱动器

SiLM59xx系列SiLM5932SHOCG-DG是一款单通道隔离驱动器&#xff0c;提供12A源电流和12A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 4A 米勒钳位。输入侧电源的工作电压为3V至5.5V&#xff0c;输出侧电源的工作电压范围为13V至30V。所有电源电压引脚都有欠压…

Java面向对象之static关键字,可变参数,递归,数组常见算法,对象数组,方法参数

第一章.static关键字 1.static的介绍以及基本使用 1.概述:static是一个静态关键字 2.使用:a.修饰一个成员变量:static 数据类型 变量名b.修饰一个方法:修饰符 static 返回值类型 方法名(形参){方法体return 结果}3.调用静态成员:类名直接调用(不用new对象)4.静态成员特点:a.静…

后端返回前端时间格式化

时间格式化的方法总共包含以下 5 种。 1.前端时间格式化 JS 版时间格式化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function dateFormat(fmt, date) { let ret; const opt { "Y": date.getFullYear().toString(), // 年 …

Python学习从0开始——Kaggle深度学习002

Python学习从0开始——Kaggle深度学习002 一、单个神经元1.深度学习2.线性单元示例 - 线性单元作为模型多个输入 3.Keras中的线性单元 二、深度神经网络1.层多种类型的层 2.激活函数3.堆叠密集层4.构建Sequential模型 三、随机梯度下降1.介绍2.损失函数3.梯度下降法1.梯度下降法…

FL Studio(FL 21)软件下载-详细安装教程视频

​fl studio 编曲软件即,简称FL,是音乐人熟知的水果编曲软件.可以完成完整的音乐制作环境或数字音频工作站(DAW)就是大家熟悉的水果 编曲软件&#xff0c;一个全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室。…

海南云亿商务咨询有限公司解锁抖音电商新纪元

在当今数字化浪潮中&#xff0c;抖音电商以其独特的魅力和强大的用户基础&#xff0c;迅速成为企业营销的新宠。海南云亿商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领先企业&#xff0c;凭借专业的团队和丰富的经验&#xff0c;为众多企业提供了高效、精准的电商服…

Keepalived介绍、安装和简单使用

目录 1 Keepalived1.1 keepalived介绍1、keepalived原理2、keepalived原理3、VRRP工作模式 1.2 keepalived安装配置1、安装配置2、keepalived配置文件详解3、通过配置文件实现资源监控 1.3 案例1、nginx keepalived 实现高可用2、nginx keepalived 实现高可用 - 非抢占模式 总…

嵌套查询(一)-谓词IN、量词ANY、量词ALL、比较运算符

一、在多个表之间进行数据查询&#xff0c;除了可以使用连接查询之外&#xff0c;也可以使用嵌套查询&#xff0c;那么什么是嵌套查询呢&#xff1f;如何使用嵌套查询呢&#xff1f; 1、将一个SELECT-FROM查询&#xff0c;嵌套在另一个SELECT查询语句中&#xff0c;那么这个SE…

swagger美化

参考资料 https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version 版本选择 需要先确认springboot版本&#xff0c;再确认swagger版本是2还是3&#xff0c;最后还要关注Springfox的版本。 确认springboot版本的方法 简单的看当前项目使用的就行 例子 https:…

前端面试项目细节重难点(已工作|做分享)(九)

面试官&#xff1a;请你讲讲你在工作中如何开发一个新需求&#xff0c;你的整个开发过程是什么样的&#xff1f; 答&#xff1a;仔细想想&#xff0c;我开发新需求的过程如下&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;理解需求文档&#xff1a; 首先&#x…