刷题笔记 - 二分搜索/查找模板

文章目录

    • 二分搜索模板
      • 直接返回mid的模板
      • 结合其他逻辑的模板

二分搜索模板

直接返回mid的模板

题目: [leetcode]

二分查找是一种高效的搜索算法,用于在有序数组中查找特定元素的位置。以下是二分查找的通用模板:

def binary_search(nums, target):# 定义搜索范围的左右边界left, right = 0, len(nums) - 1# 当左边界小于等于右边界时,进行查找while left <= right:# 计算中间元素的索引mid = left + (right - left) // 2# 如果中间元素等于目标值,则返回索引if nums[mid] == target:return mid# 如果中间元素大于目标值,则在左半部分继续查找elif nums[mid] > target:right = mid - 1# 如果中间元素小于目标值,则在右半部分继续查找else:left = mid + 1# 如果未找到目标值,则返回 -1return -1

这个模板包含以下几个关键步骤:

  1. 初始化左右边界,通常左边界为数组起始位置,右边界为数组结束位置。
  2. 在 while 循环中,判断左边界是否小于等于右边界,确保搜索范围有效。
  3. 在循环中,计算中间元素的索引。
  4. 检查中间元素是否等于目标值,如果是,则返回中间元素的索引。
  5. 如果中间元素大于目标值,则将右边界移到中间元素的左边一位,缩小搜索范围。
  6. 如果中间元素小于目标值,则将左边界移到中间元素的右边一位,缩小搜索范围。
  7. 如果循环结束时仍未找到目标值,则返回 -1,表示目标值不存在于数组中。

这个模板适用于普通的二分查找,可以在有序数组中查找指定的目标值。


在计算中间元素的索引时,我们需要考虑到当前搜索范围的左边界。使用 mid = left + (right - left) // 2 是为了确保中间元素相对于当前搜索范围的正确位置。

考虑以下情况:

假设 left = 3right = 7。如果我们简单地使用 mid = (right - left) // 2,那么 mid 的值将会是 (7 - 3) // 2 = 2,这样就会得到错误的中间索引。

正确的计算应该是当前搜索范围的起始位置 left 加上搜索范围的一半。因此,我们需要将 (right - left) 确保为当前搜索范围的长度,然后再将其除以 2。这样才能保证 mid 在当前搜索范围中的正确位置。

因此,mid = left + (right - left) // 2 是二分查找中常见且正确的计算方式。


mid = (left + right)// 2 是计算中间元素索引的一种方式,它的逻辑上是可行的,但是在极端情况下可能会导致整数溢出。

当搜索范围的左边界 left 和右边界 right 非常大的时候,left + right 的结果可能会超出整数的表示范围,导致溢出。特别是在一些语言中,整数的表示范围是有限的,如32位或64位整数。

为了避免整数溢出的问题,我们一般会采用 mid = left + (right - left) // 2 这种形式,先计算出两个索引之间的差值,再除以 2,这样可以确保计算的安全性。

因此,虽然 mid = (left + right)// 2 在一般情况下也是有效的,但为了确保程序的鲁棒性,建议采用 mid = left + (right - left) // 2 这种形式进行中间索引的计算。

结合其他逻辑的模板

题目:[leetcode]

下面是acwing算法基础课给出的模板。

bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;    // check()判断mid是否满足性质else l = mid + 1;}return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}

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

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

相关文章

Photoshop前言

Photoshop前言 分辨率图像格式工具界面组件 分辨率 分辨率是指单位长度内包含的像素点的数量&#xff0c;其单位通常为像素/英寸&#xff08;ppi&#xff09;&#xff0c;300ppi表示每英寸包含300个像素点。对于1英寸1英寸大小的图像&#xff0c;若分辨率为72ppi&#xff0c;则…

使用axios发送请求的格式是什么?示例代码

get: this.$axios({ headers:{}, url:http://apiadmin.xxdalaba.cn/api/5cda5d0b8c5cc, params:{}, }).then(function(res){ }).catch(function(err){ }) post: this.$axios({ method:’post’, headers:{}, url:http://apiadmin.xxdalaba.cn/api/5cda5d0b8c5cc, data:this.$qs…

udp/tcp回显网络编程

udp DatagramSocket 用于接收和发送udp数据报 构造方法&#xff1a; DatagramSocket():创建一个UDP数据报套接字的Socket&#xff0c;绑定到本地上 一个随机可用端口上&#xff0c;一般用于客户端DatagramSocket(int port):创建一个UDP数据报套接字的Socket&#xff0c;绑定到…

玩comfyui踩过的坑之使用ComfyUI_Custom_NODES_ALEKPET翻译组件问题

环境&#xff1a; 秋叶安装包&#xff0c;安装ComfyUI_Custom_NODES_ALEKPET组件或者直接下载网盘中的包&#xff0c;直接解压包到comfyui根目录/custom_nodes/&#xff0c;重启后&#xff0c;按指导文件操作。 注意&#xff1a;网盘指导包中有配置好的流程json文件&#xff0…

Python爬虫:XPath解析爬取豆瓣电影Top250示例

一、示例的函数说明&#xff1a; 函数processing()&#xff1a;用于处理字符串中的空白字符&#xff0c;并拼接字符串。 主函数程序入口&#xff1a;每页显示25部影片&#xff0c;实现循环&#xff0c;共10页。通过format方法替换切换的页码的url地址。然后调用实现爬虫程序的…

平衡二叉搜索树(AVL)旋转

单独开一章节介绍 RotateL 、 RotateR 及更复杂的 LR 和 RL 型旋转&#xff0c;更多是为了红黑树的旋转部分做铺垫&#xff1b;由于 AVL 树和红黑树发生旋转的判断标准不同 —— 分别为平衡因子和节点的颜色&#xff0c;两棵树左旋和右旋的在细节上会有一些差异&#xff0c;但从…

实现VUE DPlayer录像功能:Canvas加MediaRecorder

在做之前&#xff0c;以为DPlaye知道数据流&#xff0c;录像直接保存即可。结果是&#xff0c;根本没有录像功能。 怎么办呢&#xff1f;搜索了一番&#xff0c;给出的建议是使用Canvas加MediaRecorder来实现。大意是使用canvas&#xff0c;定时把视频画面刷过来&#xff1b;然…

Java基础教程(12)-Java中的IO流

IO是指Input/Output,即输入和输出。以内存为中心: Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等。Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等。流的输入和输出 Java程序通过流来完成输…

发表博客之:cutlass demo讲解,在 sm75 机器上用 cuda core计算 fp32 矩阵乘法!对cutlass 感兴趣的看客别走开!!

文章目录 [发表博客之&#xff1a;cutlass demo讲解&#xff0c;在 sm75 机器上用 cuda core计算 fp32 矩阵乘法&#xff01;对cutlass 感兴趣的看客别走开&#xff01;&#xff01;](https://cyj666.blog.csdn.net/article/details/138469553)深入理解 cutlass 在 sm75 cuda c…

基于Spring Boot的线上交流互动系统设计与实现

基于Spring Boot的线上交流互动系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

「 网络安全常用术语解读 」通用安全通告框架CSAF详解

1. 简介 通用安全通告框架&#xff08;Common Security Advisory Framework&#xff0c;CSAF&#xff09;通过标准化结构化机器可读安全咨询的创建和分发&#xff0c;支持漏洞管理的自动化。CSAF是OASIS公开的官方标准。开发CSAF的技术委员会包括许多公共和私营部门的技术领导…

如何使用预训练的通用音频表示进行心脏杂音检测

心脏杂音检测是心血管疾病诊断中的一个重要方面&#xff0c;通过听诊器进行检查是常见方法&#xff0c;但对临床医生的经验依赖很大。为了减少心脏声音解释中对熟练临床医生的需求&#xff0c;探索自动化心脏听诊的深度学习方法很有必要。然而&#xff0c;尽管深度学习模型通常…

Redis Cluster集群方案什么情况下会导致整个集群不可用?

Redis 没有使用哈希一致性算法&#xff0c;而是使用哈希槽。 Redis 中的哈希槽一共有16384个&#xff0c;计算给定 密钥的哈希槽&#xff0c;我们只需要对密钥的 CRC16 去取 16384。假设集群中有A、B、C三个集群节点&#xff0c; 不存在复制模式下&#xff0c;每个集群的节点包…

、、、、、

、、 、 transient 关键字总结 1&#xff09;transient修饰的变量不能被序列化&#xff1b;2&#xff09;transient只作用于实现 Serializable 接口&#xff1b;3&#xff09;transient只能用来修饰普通成员变量字段&#xff1b;4&#xff09;不管有没有 transient 修饰&…

网络工程师必学知识:SSH登录抓包分析报文交互过程

网络工程师必学知识:SSH登录抓包分析报文交互过程 1.概述:2.SSH传输层协议:3.SSH用户认证协议:4.SSH连接协议:5.抓包看看:6.总结:1.概述: SSH(Secure Shell ,安全外壳协议),就是在不安全的协议外层再加一层安全外壳。比如说telnet+SSH=stelnet。 SSH由三个组件构成:…

ASP.NET网上书店

摘要 本设计尝试用ASP.NET在网络上架构一个电子书城&#xff0c;以使每一位顾客不用出门在家里就能够通过上网来轻松购书。本文从理论和实践两个角度出发&#xff0c;对一个具有数据挖掘功能电子书城进行设计与实现分析。论文首先较为详尽地介绍了面向对象分析与设计的有关概念…

C++实验五 : 类的继承 -----CUST

【题目】 1.定义person类&#xff0c;包括数据私有成员&#xff1a;姓名&#xff0c;性别&#xff1b;共用成员函数&#xff1a;带参数构造函数&#xff0c;display函数输出本类对象的所有数据成员值。 2.定义student类&#xff0c;保护继承person类&#xff1b;增加保护数据成…

docker desktop实战部署oracle篇

1、前言 oracle数据库官方已提供现成的镜像&#xff0c;可以直接拿来部署了。 由于项目中需要使用oracle数据库的分表功能&#xff0c;之前安装的是standard版本&#xff0c;无奈只能重新安装。网上查了一番&#xff0c;使用的方法都比较传统老旧&#xff1a;下载安装包手动安…

golang获取变量动态类型

类型断言&#xff1a;data.(Type) 类型断言是最常用的获取变量动态类型的方法之一。允许在运行时将接口值转换为其具体类型。 data 是一个接口类型的变量。 Type 是一个具体的类型。 这个表达式的含义是&#xff0c;如果 data 的底层值是 Type 类型&#xff0c;那么 value 将接…

深度学习之GAN网络

目录 关于GAN网络 关于生成模型和判别模型 GAN网路的特性和搭建步骤&#xff08;以手写字体识别数据集为例&#xff09; 搭建步骤 特性 GAN的目标函数&#xff08;损失函数&#xff09; 目标函数原理 torch.nn.BCELoss&#xff08;实际应用的损失函数&#xff09; 代码…