【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原创…

【数据结构与算法】图的基本概念

文章目录 图的基本概念定义常用术语有向图无向图简单图、多重图完全图&#xff08;简单完全图&#xff09;子图连通、连通图和连通分量强连通图、强连通分量边的权和网稠密图、稀疏图路径、路径长度和回路简单路径、简单回路距离有向树 图的基本概念 定义 图是一种非线性的逻…

【收藏】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…

linux环境打包QML程序

第一次打包linux下的QML程序&#xff0c;一路磕磕绊绊&#xff0c;如果有更好的方式&#xff0c;欢迎留言。 1、使用release编译出可执行文件&#xff0c;这一步大家都知道吧&#xff1b; 2、将可执行文件放入新建文件夹project中&#xff0c;同时创建copylib.sh文件&#xf…

魔众文库系统v6.7.0版本用户注册登录优化,已知问题修复

2024-06-14 更新日志 用户注册登录优化&#xff0c;已知问题修复 [新功能] Hidden 组件支持序列化类型&#xff0c;避免入库异常 [新功能] 增加命令执行函数和数组多键值排序方法 [新功能] 后台安全提醒修改密码链接不存在问题 [新功能] 优化 Nav 组件&#xff0c;支持链式…

远程开发端口转发

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

电压kV为什么k要小写,原因你知道吗?

国际标准的计量单位一般用小写。仅在涉及以名字命名的单位&#xff0c;比如伏特V、安培A、开尔文K、瓦特W等&#xff0c;为了表示对科学家前辈的尊重&#xff0c;就用大写&#xff0c;其余的非以人名命名的单位一般用小写。这里解释了为何V是大写。 其次&#xff0c;对于量词&…

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

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

YOLOv10改进|采用ADown降采样模块有效融合

📚 专栏地址:《YOLOv10算法改进实战》 👉 独家改进,对现有YOLOv10进行二次创新,提升检测精度,适合科研创新度十足,强烈推荐 🌟 统一使用 YOLOv10 代码框架,结合不同模块来构建不同的YOLO目标检测模型。 💥 本博客包含大量的改进方式,降低改进难度,改进点包含【B…

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.静…

go grpc安装protobuf

1. https://github.com/protocolbuffers/protobuf/releases -> assets 下载 protoc-27.1-win64.zip window*64位 找个位置解压&#xff0c; 并将解压文件的bin目录复制加入环境变量&#xff0c;cmd输入protoc查看安装是否成功 https://github.com/protocolbuffe…

后端返回前端时间格式化

时间格式化的方法总共包含以下 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.梯度下降法…