首先要明确二分查找算法如何实现,是采用左闭右闭还是左闭右开

左闭右闭

第⼀种写法,我们定义 target 是在⼀个在左闭右闭的区间⾥,也就是[left, right] (这个很重要⾮常重要)

区间的定义这就决定了⼆分法的代码应该如何写,因为定义target[left, right]区间,所以有如下两点:

while (left <= right) 要使⽤ <= ,因为left == right是有意义的,所以使⽤ <=

if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]⼀定不是target,那么接

下来要查找的左区间结束下标位置就是 middle - 1

左开右闭

如果说定义 target 是在⼀个在左闭右开的区间⾥,也就是[left, right) ,那么⼆分法的边界处理⽅式则截然不同。

有如下两点:

while (left < right),这⾥使⽤ < ,因为left == right在区间[left, right)是没有意义的

if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻

找,⽽寻找区间是左闭右开区间,所以right更新为middle,即:下⼀个查询区间不会去⽐较nums[middle]

复杂度:对于长度为n的数组,最坏情况下需要进行log₂n次比较操作。每次操作的时间复杂度为O(1),因此总的时间复杂度为对数阶O(log n)

74. 搜索二维矩阵

74. 搜索二维矩阵 - 力扣(LeetCode)

class Solution(object):def searchMatrix(self, matrix, target):""":type matrix: List[List[int]]:type target: int:rtype: bool"""m=len(matrix)#行n=len(matrix[0])#列#每一个编号可以为n*行号+列号left=0right=m*n-1while(left<=right):middle=(left+right)/2loclm,locrm=middle/n,middle-middle/n*n#loclm,locrm=middle//n,middle%nif matrix[loclm][locrm]==target:return Trueelif matrix[loclm][locrm]>target:right=middle-1else:left=middle+1return False   

34. 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

相当于找一个框可以包住target数组,比如[5,7,7,8,8,10]target=8的例子就是希望能找到[7,8,8,10]这个框

寻找target在数组里的左右边界,有如下三种情况:

  • 情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}
  • 情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
  • 情况三:target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}

这三种情况都考虑到,说明就想的很清楚了。

接下来,在去寻找左边界,和右边界了。

采用二分法来去寻找左右边界,两个二分来寻找左边界和右边界。

代码随想录

为了避免上面的情况,所以需要初始化为-2而不是-1

rightborder=-2,leftborder=-2

class Solution(object):def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""left=0right=len(nums)-1#左闭右闭查找方式#相当于找一个框可以包住target数组,比如[5,7,7,8,8,10]target=8的例子就是希望能找到[7,8,8,10]这个框rightborder=-2leftborder=-2#leftborder查找while left<=right:middle=(left+right)/2if target>nums[middle]:left=middle+1elif target<=nums[middle]:right=middle-1#这里更新跟随等号走,并且更新为right而不是middleleftborder=right#rightborder查找#重新初始化left=0right=len(nums)-1while left<=right:middle=(left+right)/2if target>=nums[middle]:left=middle+1rightborder=leftelif target<nums[middle]:right=middle-1if rightborder ==-2 or leftborder ==-2:return [-1,-1]#区间长度至少为2elif rightborder-leftborder>1:return [leftborder+1,rightborder-1]else:return [-1,-1]

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

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

相关文章

损失函数,及其优化方法

什么是损失函数&#xff1f;损失函数&#xff0c;也称为代价函数&#xff0c;是一个用来​​衡量机器学习模型预测结果与真实值之间差距​​的函数。损失函数的优化方法有哪些&#xff0c;各自优缺点是什么&#xff0c;他们的应用范围是什么&#xff1f;方法类别代表算法核心思…

pyqt+Python证件号智能校验工具

目录 一、引言 二、GUI界面设计 1.相关提示 2.效果演示 3.界面设计.py 三、主要程序详解 1.导入相关模块 2.初始化设置 3.校验过程 四、总程序代码 一、引言 在数字化转型加速的背景下&#xff0c;证件信息核验已成为金融、政务、安防等领域的刚需。传统人工校验存在…

主流技术栈 NestJS、TypeScript、Node.js版本使用统计

&#x1f4ca; 2024年主流技术栈版本使用统计&#x1f527; TypeScript 采用情况全球采用率: 38.5% 的开发者使用 TypeScript&#xff08;Stack Overflow 2024&#xff09;增长趋势: 从 2017年的 12% 增长到 2024年的 35%&#xff08;JetBrains 调研&#xff09;TypeScript vs …

Techub News 与 TOKENPOST 达成战略合作以推动中韩 Web3 资讯互通

Techub News 消息&#xff0c;香港 Web3 媒体 Techub News 与韩国区块链媒体 TOKENPOST 达成战略合作。TOKENPOST 将开设香港内容板块&#xff0c;由 Techub News 提供本地化行业资讯&#xff1b;同时 Techub News 将推出韩国内容专栏&#xff0c;内容源由 TOKENPOST 支持。这一…

Java面试实战系列【JVM篇】- JVM内存结构与运行时数据区详解(私有区域)

文章目录一、前言1.1 什么是JVM内存结构1.2 JVM内存结构与Java内存模型的区别1.3 为什么面试官爱问JVM内存结构二、JVM运行时数据区总览2.1 运行时数据区域划分2.2 线程私有区域 vs 线程共享区域三、线程私有区域详解3.1 程序计数器&#xff08;PC Register&#xff09;3.1.1 定…

鸿蒙中使用极光推送

官方给出的步骤是对的&#xff0c;就是一时不知道从何下手&#xff0c;自己整了下&#xff0c;按照这个来就行 1.步骤 打开 APP 通知功能 1.先按照这个页面进行配置SDK 集成指南 - 极光文档&#xff0c;主要就是下载极光sdk&#xff0c;然后在AGC里开通推送服务&#xff0c;配…

ruoyi_wvp流媒体[海康 大华 GB1812 onvif rtsp]

ZLMediaKitxiaz: https://download.csdn.net/download/jinhuding/91775096 webrtc: https://download.csdn.net/download/jinhuding/91764243 yoloonnx(v3,v7,v8s,v9c)&#xff1a;https://download.csdn.net/download/jinhuding/91775170 项目部署步骤 1.后端目录结构 2.前端…

强化学习笔记(二):有限马尔可夫决策过程(一)

有限马尔可夫决策过程 基本概念 多臂老虎机仅涉及评价性反馈&#xff0c;即动作的即时奖励&#xff0c;估计每个动作 aaa 的价值 q∗(a)q_*(a)q∗​(a)。 有限马尔可夫决策过程&#xff08;Finite MDP&#xff09;引入了关联性因素&#xff0c;即在不同状态&#xff08;情境&am…

Maven项目中settings.xml终极优化指南

文章目录1. 基础优化2. 镜像源优化&#xff08;国内推荐&#xff09;3. 插件仓库优化4. 并行构建提升 30%-80%5. 下载可靠性优化6. CI/CD 环境优化7. 进阶&#xff1a;依赖锁定与预下载8. 实现效果Maven settings.xml 终极优化指南&#xff0c;重点是&#xff1a;构建速度提升、…

RCC_APB2PeriphClockCmd

RCC_APB2PeriphClockCmd 函数在STM32的标准外设库中扮演着“电源开关”的角色。要理解这个函数&#xff0c;我们需要明白STM32微控制器的几个关键概念&#xff1a;1. 外设时钟与低功耗设计STM32内部有非常多的外设&#xff0c;如GPIO&#xff08;A, B, C...D&#xff09;、USAR…

用大语言模型实现语音到语音翻译的新方法:Scheduled Interleaved Speech-Text Training

用大语言模型实现语音到语音翻译的新方法:Scheduled Interleaved Speech-Text Training 在人工智能领域,语音到语音翻译(Speech-to-Speech Translation, S2ST)一直是极具挑战性的任务。传统的做法是将语音识别、文本翻译和语音合成三个步骤串联起来,而近年来,端到端的S2…

LLM学习:langchain架构——模型IO

1、什么是模型IO模型 I/O&#xff08;Model I/O&#xff09; 是 LangChain 框架中最核心的模块之一&#xff0c;负责处理与语言模型&#xff08;LLM&#xff09;交互的输入构建、模型调用和输出解析全流程。它主要分为三个模块&#xff1a;Prompts&#xff08;输入构建&#xf…

Windows系统下python新一代三方库管理工具uv及VSCode配置

python新一代三方库管理工具uv uv是什么&#xff1f; uv是用RUST语言写的一个python三方库和项目管理工具&#xff0c;详见官网&#xff08;uv&#xff09;。 uv的安装 官网上提供了两种安装方式&#xff0c;第一种需要在PS终端里运行一下命令进行安装&#xff1a; powersh…

Node.js 多版本管理工具 nvm 的安装与使用教程(含镜像加速与常见坑)

适用人群&#xff1a;前端/后端/全栈开发者&#xff0c;Mac/Linux/Windows&#xff08;nvm-windows&#xff09;用户&#xff1b;需要在多项目间快速切换 Node 版本、或在国内网络环境下稳定安装 Node。一、为什么要用 nvm&#xff1f;一机多版本&#xff1a;不同项目依赖不同 …

Unity Shader unity文档学习笔记(二十一):几种草体的实现方式(透明度剔除,GPU Instaning, 曲面细分+几何着色器实现)

1.透明度剔除&#xff08;性能较差&#xff0c;不同颜色时需要不同材质会导致多个dc&#xff09; clip(_Color.a - _Cutoff); 传入值为0时 剔除 类似的草体效果&#xff1a; 2.GPU Instaning(可以自定义一次性合批最多1023个&#xff0c;能够传递颜色值等等&#xff08;做草…

UX 设计入门终章:让洞察落地!用用户流程图、IA 和旅程图,设计用户与产品的互动故事

欢迎来到本系列课程的最后一课。 如果你把之前的学习比作是绘制一份建筑蓝图&#xff0c;那么今天&#xff0c;你将根据自己收集到的所有用户数据&#xff0c;描绘出空间布局&#xff08;用户流程图&#xff09;、理清结构关系&#xff08;信息架构&#xff09;&#xff0c;并最…

【RAG知识库实践】向量数据库VectorDB

一、概述 1.1 什么是向量库 向量数据库是一种专门为存储、索引和查询高维向量数据而优化的数据库系统。与传统的关系型数据库不同,向量数据库将数据映射到向量空间中,使得数据的相似性计算、聚类、分类和检索变得更加高效和精确 向量数据库一般包括以下几个部分:索引、查询…

EasyExcel 3.x 导出动态表头,动态sheet页

动态导出sheet页Overridepublic void exportAnswerListV1(HttpServletResponse response, SmtSurveyUserAnswerRecord smtSurveyUserAnswerRecord) {// 1. 准备问卷数据String formType smtSurveyUserAnswerRecord.getFormType();if (ObjectUtil.isEmpty(formType)) {throw ne…

重学JS-004 --- JavaScript算法与数据结构(四)JavaScript 表单验证

文章目录HTMLlabel 属性input 属性button 属性fieldset 属性select 属性option 属性div 属性scriptgetElementByIdquerySelectorAllnull循环模版文字函数事件监听器regex举例StringMathArrayHTML HTML 属性应该用双引号引起来。 label 属性 for“” input 属性 id“” typ…

本地搭建 Redis/MySQL 并配置国内镜像加速(Docker/原生安装 | macOS/Linux/Windows)

适用人群&#xff1a;前端/后端/数据/测试工程师&#xff1b;需要在单机上快速搭建 Redis 与 MySQL 的开发环境&#xff1b;同时在国内网络环境下加速下载&#xff08;容器镜像、系统包仓库&#xff09;。文章结构&#xff1a;一图流 → TL;DR → Docker 方式 → 原生安装&…