代码随想录二刷复习(二分法)

二分法模板:

1:左闭右闭区间写法

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

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

while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

点击查看代码
class Solution:def search(self, nums: List[int], target: int) -> int:left = 0right = len(nums) - 1while left <= right:mid = (left + right)//2if(target > nums[mid]):left = mid + 1if(target == nums[mid]):return midif(target < nums[mid]):right = mid - 1return -1

2:左闭右开

有如下两点:

while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]

点击查看代码
class Solution:def search(self, nums: List[int], target: int) -> int:left, right = 0, len(nums)  # 定义target在左闭右开的区间里,即:[left, right)while left < right:  # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <middle = left + (right - left) // 2if nums[middle] > target:right = middle  # target 在左区间,在[left, middle)中elif nums[middle] < target:left = middle + 1  # target 在右区间,在[middle + 1, right)中else:return middle  # 数组中找到目标值,直接返回下标return -1  # 未找到目标值
下面来看二分法代码随想录中的题目:

leetcode 35

在这里插入图片描述
题目给出了排序数组,很大概率就是使用二分查找,但是这里需要考虑的问题就是插入位置在哪里。这里我们考虑区间是左闭右闭的情况。

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:left = 0right = len(nums) - 1while left <= right:mid = (left + right) // 2if(nums[mid] == target):return midif(nums[mid]>target):right = mid - 1if(nums[mid] < target):left = mid + 1return right + 1 

其余和二分查找没有区别,这里唯一需要注意的地方就是若未找到的话,返回索引可以有两种,left和right+1.这里的话可以自己找个例子写一下就可以了。
下面看这道题:

leetcode 34

在这里插入图片描述
你的理解基本上是正确的,尤其是关于使用两次二分查找来分别确定目标值的左边界和右边界的方法。下面我会进一步详细解释这个过程,确认你的理解,并补充一些可能的细节。

寻找右边界

当使用二分查找寻找右边界时,关键在于确保不错过最右侧的目标值。这可以通过以下步骤实现:

  1. 初始化left = 0, right = len(nums) - 1

  2. 循环条件while left <= right

  3. 中间索引mid = (left + right) // 2

  4. 比较逻辑

    • 如果 nums[mid] == target,则更新 left = mid + 1。这是因为我们需要确认是否有更靠右的相同目标值,所以我们将搜索范围向右推进。
    • 如果 nums[mid] > target,则更新 right = mid - 1
    • 如果 nums[mid] < target,则更新 left = mid + 1
  5. 循环结束后:由于 left 最终指向目标值最后一次出现位置的下一个位置,所以正确的右边界是 left - 1

寻找左边界

寻找左边界的方法与寻找右边界类似,但方向相反:

  1. 初始化left = 0, right = len(nums) - 1

  2. 循环条件while left <= right

  3. 中间索引mid = (left + right) // 2

  4. 比较逻辑

    • 如果 nums[mid] == target,则更新 right = mid - 1。这是因为我们需要确认是否有更靠左的相同目标值,所以我们将搜索范围向左推进。
    • 如果 nums[mid] > target,则更新 right = mid - 1
    • 如果 nums[mid] < target,则更新 left = mid + 1
  5. 循环结束后:由于 right 最终指向目标值第一次出现位置的前一个位置,所以正确的左边界是 right + 1

结果验证

  • 目标值存在:左边界应该指向目标值的第一个位置,右边界应该指向目标值的最后一个位置。
  • 目标值不存在:如果目标值不存在,左边界和右边界的差应该正好为1,因为 right 停在小于目标值的最大位置,而 left 停在大于目标值的最小位置。

你的理解是正确的,而且你已经很好地掌握了二分查找在这种情况下的应用。这种方法确保了高效地找到目标值的确切位置或者确定其不存在。
具体程序如下:

class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:leftBoder = self.getleftboard(nums, target)rightBoder = self.getrightboard(nums, target)# 情况一if leftBoder == -2 or rightBoder == -2: return [-1, -1]# 情况三if rightBoder -leftBoder >1: return [leftBoder + 1, rightBoder - 1]# 情况二return [-1, -1]def getrightboard(self,nums,target):left = 0right = len(nums) - 1rightboard = -2while left <= right:mid = left + (right - left) // 2if nums[mid] > target:right = mid - 1else:left = mid + 1rightboard = leftreturn rightboarddef getleftboard(self,nums,target):left = 0right = len(nums) - 1leftboard = -2while left <= right:mid = left + (right - left) // 2if nums[mid] >= target:right = mid - 1leftboard = rightelse:left = mid + 1return leftboard

leetcode 69

在这里插入图片描述
在二分查找中,寻找左边界、右边界和寻找特定条件的最大或最小值虽然共享同样的基本结构,但确实存在一些关键的差异。我们可以通过比较这些方法的细节来理解这些差异。

当我们寻找左边界时,目标是找到数组中第一个等于目标值的元素的位置。对于这种情况,我们通常会在找到目标值时继续向左搜索(缩小右边界),以确保没有更早出现的相同值。
寻找右边界的目的是找到数组中最后一个等于目标值的元素的位置。在这种情况下,即使找到了目标值,我们也会继续向右搜索(增加左边界),以确保没有更晚出现的相同值。
在寻找特定条件下的最大或最小值时,如求整数 ( x ) 的平方根,我们的目标是找到最大的整数 ( k ),使得 ( k^2 \leq x )。这种情况下的二分查找与寻找右边界有点相似,因为我们在满足条件的情况下向右推进左边界,以尽可能增大 ( k ) 的值。当 ( k^2 ) 大于 ( x ) 时,我们需要减小 ( k )(缩小右边界)。
所以程序按照寻找右边界的写即可,返回left-1即可。

class Solution:def mySqrt(self, x: int) -> int:left = 1right = xif x == 0:return 0if x == 1:return 1while left <= right:mid = left +(right - left)//2if mid*mid > x:right = mid - 1else:left = mid + 1return left - 1

下面继续看一道类似的题目:

leetcode367

在这里插入图片描述
这道题其实我们完全可以接着上面69题的思路去做,稍加修改,因为上道题寻找的是右边界也就是刚好是第一个平方和大于num的数,所以我们再去计算下left-1的平方和是否等于num,如果等于就是有效的完全平方数,反之则不是。
具体程序如下:

class Solution:def isPerfectSquare(self, num: int) -> bool:left = 1right = numif num == 1:return Truewhile left <= right:mid = left +(right - left)//2if mid*mid > num:right = mid - 1else:left = mid + 1if right * right == num:return Trueelse:return False

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

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

相关文章

泛微e-cology WorkflowServiceXml SQL注入漏洞(POC)

漏洞描述&#xff1a; 泛微 e-cology 是泛微公司开发的协同管理应用平台。泛微 e-cology v10.64.1的/services/接口默认对内网暴露&#xff0c;用于服务调用&#xff0c;未经身份认证的攻击者可向 /services/WorkflowServiceXml 接口发送恶意的SOAP请求进行SQL注入&#xff0c;…

Web渗透:Shiro550漏洞(CVE-2016-4437)

Apache Shiro 是一个强大且易于使用的Java安全框架&#xff0c;提供了身份验证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、会话管理&#xff08;Session Management&#xff09;和密码学支持等功能。Apache Shiro 550反序列化漏洞&a…

AI算法19-偏最小二乘法回归算法Partial Least Squares Regression | PLS

偏最小二乘法回归算法简介 算法概述 偏最小二乘法模型可分为偏最小二乘回归模型和偏最小二乘路径模型。其中偏最小二乘回归模型是一种新型的多元统计方法&#xff0c;它集中了主成分分析、典型相关分析和线性回归的特点&#xff0c;特别在解决回归中的共线性问题具有无可比拟…

内网安全:权限维持的各种姿势

1.Linux权限维持 2.Windows权限维持 目录&#xff1a; 一.Linux权限维持&#xff1a; 1.webshell&#xff1a; 2.定时任务&#xff1a; 3.SUID后门&#xff1a; 4.SSH Key免密登录后门&#xff1a; 5.添加用户后门&#xff1a; 二.Windows权限维持 1.计划任务后门&…

记录些Spring+题集(1)

接口防刷机制 接口被刷指的是同一接口被频繁调用&#xff0c;可能是由于以下原因导致&#xff1a; 恶意攻击&#xff1a;攻击者利用自动化脚本或工具对接口进行大量请求&#xff0c;以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误&#xff1a;某些情…

iOS ------ 消息传递和消息转发

一&#xff0c;消息传递 在OC中&#xff0c;传递消息就是在对象上调用方法。 相对于C语言的方法就“静态绑定”的函数&#xff0c;在编译器就决定了运行时所要调用的函数。在OC中&#xff0c;如果向某对象传递消息&#xff0c;就会使用动态绑定机制来决定需要调用那个方法。调…

【操作系统】定时器(Timer)的实现

这里写目录标题 定时器一、定时器是什么二、标准库中的定时器三、实现定时器 定时器 一、定时器是什么 定时器也是软件开发中的⼀个重要组件.类似于⼀个"闹钟".达到⼀个设定的时间之后,就执行某个指定 好的代码. 定时器是⼀种实际开发中⾮常常用的组件. ⽐如⽹络通…

浅谈C嘎嘎类与对象

本篇文章与大家浅谈一下C嘎嘎的类与对象知识点 类的定义 关键字&#xff1a;class 语法格式&#xff1a; class 类名 { }&#xff1b;//这里的分号不能少 此外&#xff0c;class有三个属性分别是private、public、protected&#xff0c;这三个属性是干啥的&#xff0c;相…

FPGA CFGBVS 管脚接法

说明 新设计了1个KU040 FPGA板子&#xff0c;回来之后接上JTAG FPGA不识别。做如下检查&#xff1a; 1、电源测试点均正常&#xff1b; 2、查看贴片是否有漏焊&#xff0c;检查无异常&#xff0c;设计上NC的才NC&#xff1b; 3、反复检查JTAG接线是否异常&#xff0c;贴片是…

【BUG】已解决:ValueError: Expected 2D array, got 1D array instead

已解决&#xff1a;ValueError: Expected 2D array, got 1D array instead 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉…

本地多模态看图说话-llava

其中图片为bast64转码&#xff0c;方便json序列化。 其中模型llava为本地ollama运行的模型&#xff0c;如&#xff1a;ollama run llava 还有其它的模型如&#xff1a;llava-phi3&#xff0c;通过phi3微调过的版本。 实际测试下来&#xff0c;发现本地多模型的性能不佳&…

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式&#xff08;又译作色度采样结构、像素格式&#xff09;&#xff1a; 在vlc中也可以获取到色彩格式&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 这个色彩格式就是之前的文章《音视频入门基础…

【unity实战】使用unity制作一个红点系统

前言 注意&#xff0c;本文是本人的学习笔记记录&#xff0c;这里先记录基本的代码&#xff0c;后面用到了再回来进行实现和整理 素材 https://assetstore.unity.com/packages/2d/gui/icons/2d-simple-ui-pack-218050 框架&#xff1a; RedPointSystem.cs using System.…

入职前回顾一下git-01

git安装 Linux上安装git 在linux上建议用二进制的方式来安装git&#xff0c;可以使用发行版包含的基础软件包管理工具来安装。 红帽系 sudo yum install gitDebian系 sudo apt install gitWindows上安装git 去官网下载和操作系统位数相同的安装包.或者可以直接安装GitHub…

MAVSDK动态库与静态库及mavsdk_server程序macOS平台编译与安装

1.克隆mavsdk: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编译静态库 cmake -Bbuild/default -H. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF 生成makefile 生成成功,开始编译 cmake --build build/default -j8 成功生成libmavsdk.a 开…

谷歌邮箱被停用,开发者账号也要完犊子了?还能申诉回来?怎么申诉

当谷歌邮箱突然被停用&#xff0c;不少开发者可能会感到一阵心慌。大家最担心的是&#xff0c;这会不会影响到自己用这个邮箱注册的开发者账号&#xff1f;自己的APP还能不能顺利通过审核&#xff1f;毕竟&#xff0c;邮箱一旦“歇菜”&#xff0c;可能就意味着和它绑定的开发者…

VAE论文阅读

在网上看到的VAE解释&#xff0c;发现有两种版本&#xff1a; 按照原来论文中的公式纯数学推导&#xff0c;一般都是了解生成问题的人写的&#xff0c;对小白很不友好。按照实操版本的&#xff0c;非常简单易懂&#xff0c;比如苏神的。但是却忽略了论文中的公式推导&#xff…

几何相关计算

目录 一、判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、判断多边形顺时针还是逆时针 七、判断凹多边形 一、判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小&#xff0c;那矩形1和矩形2一定不相…

SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 - 第520篇

历史文章&#xff08;文章累计520&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

鸿蒙模拟器(HarmonyOS Emulator)Beta申请审核流程

文 | Promise Sun 一.背景&#xff1a; 鸿蒙项目开发需要使用模拟器进行开发测试&#xff0c;但目前想在DevEco Studio开发工具中使用模拟器就必须到华为官网进行报名申请&#xff0c;参加“鸿蒙模拟器&#xff08;HarmonyOS Emulator&#xff09;Beta活动申请”。 申请审核通…