Leetcode二分搜索法浅析
文章目录
- 1.二分搜索法
- 1.1什么是二分搜索法?
- 1.2解法思路
- 1.3扩展
1.二分搜索法
题目原文:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
1.1什么是二分搜索法?
我们来看AI给出的回答:
二分搜索法,又称折半查找算法,是一种在有序列表(如数组)中高效查找特定元素的搜索算法。该算法利用了列表元素已排序的特性,通过反复将待搜索区间分成两半来缩小查找范围,具体步骤如下:
初始化: 确定搜索区间,通常开始时是整个列表,设两个指针分别指向列表的起始位置(low)和结束位置(high)。
计算中间位置: 计算当前搜索区间的中间索引 mid = (low + high) / 2,并获取该位置的元素值。
比较与决策:
- 如果中间元素正好是要查找的目标,则搜索结束,返回该元素的位置。
- 如果目标值小于中间元素,则在左半区间(low 到 mid-1)继续搜索,更新 high = mid - 1。
- 如果目标值大于中间元素,则在右半区间(mid+1 到 high)继续搜索,更新 low = mid + 1。
重复步骤2和3,直到找到目标值或搜索区间为空(即 low > high),此时表明目标值不在列表中。
二分搜索法的时间复杂度为 O(log n),其中 n 是列表中元素的数量。这意味着对于大规模数据集合,二分搜索远比顺序搜索(时间复杂度为 O(n))高效。然而,为了应用二分搜索,列表必须事先排序,且通常适用于静态数据或不频繁插入删除操作的数据结构。
可以看出二分搜索法顾名思义就是不断来缩小我们的搜索区间,来查找特定元素的一种高效算法,而在使用二分搜索法时,关键的地方就在于如何确定我们的区间边界。
1.2解法思路
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size()-1;while(left <= right){int madile = left+(right - left) / 2;if(nums[madile] > target){right = madile - 1;}if(nums[madile] < target){left = madile + 1;}if(nums[madile] == target){return madile;}}return -1;}
};
开始我们可以给定一个左闭右闭的区间,是左区间left = 0,右区间right = nums.size -1,此时判断边界时就需要考虑:左区间和右区间的关系时小于等于还是小于?
开始我们的思路时给定一个左闭右闭的区间,也就是说左区间的值可以等于右区间,所以在第一个边界判断时,我们的左区间是可以等于右区间的。
当我们对目标值进行判断后,我们的左右区间又该如何判断呢?
第一种情况:当我们所要查找的目标值小于区间中值时,我们需要考虑的是,此时的右区间right是等于madile还是等于madile-1,回到判断条件中nums[madile] > target,这表示我们区间的中值已经大于我们的目标值了,所以我们下一次的判断时,已经不需要考虑madile,所以此时的右区间应该是madile-1。
同样的道理当区间中值小于目标值时,我们要更新左区间的值,此时左区间的值为madile+1。

1.3扩展
题目原文:
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
**注意:**不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
这道题使用二分法的思路如下:
要使用二分法找到非负整数 x 的算术平方根的整数部分,你可以遵循以下步骤:
-
初始化两个指针,
left和right。因为我们要找的是非负整数的平方根,所以left初始化为 0,而right初始化为x。如果x是 0,则直接返回 0。 -
进入一个循环,只要
left小于等于right,就继续循环。 -
在每次循环中,计算
mid,它是left和right的中间值(向下取整),然后检查mid * mid是否等于x。如果是,那么mid就是我们要找的平方根,直接返回它。 -
如果
mid * mid大于x,说明我们超出了目标平方根,因此需要将right更新为mid - 1。 -
如果
mid * mid小于x,说明目标平方根还在mid的右侧(包括mid),因此需要将left更新为mid + 1。 -
循环结束后,
left会指向我们找到的整数平方根(因为循环条件是left <= right,当循环停止时,实际上left可能已经超过了正确的答案,但由于我们是向下取整寻找平方根,最终正确的整数平方根是left - 1,除非x是完全平方数)。
题解:
class Solution {
public:int mySqrt(int x) {if (x == 0 || x == 1) {return x;}int left = 0, right = x;while (left <= right) {int mid = left + (right - left) / 2;long long square = static_cast<long long>(mid) * mid;if (square == x) {return mid;} else if (square < x) {left = mid + 1;} else {right = mid - 1;}}return left - 1;}
};
相关文章:
Leetcode二分搜索法浅析
文章目录 1.二分搜索法1.1什么是二分搜索法?1.2解法思路1.3扩展 1.二分搜索法 题目原文: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值…...
昇思25天学习打卡营第24天|ResNet50迁移学习
课程打卡凭证 迁移学习 迁移学习是机器学习中一个重要的技术,通过在一个任务上训练的模型来改善在另一个相关任务上的表现。在深度学习中,迁移学习通常涉及在一个大型数据集(如ImageNet)上预训练的模型上进行微调,以便…...
Shell 构建flutter + Navtive 生成IPA
具体实现: #1. 在工程的根目录下,建立文件夹build_iOS文件,在此文件下建立build_iOS.sh的文件,把以下内容copy进sh文件;build_iOS.sh 就是第5步之后整个的脚本内容。 #2. 进入build_iOS.sh 文件的目录; #3. 在build_iOS 文件夹配置打包的DEVELOPExportOptionsPlist…...
python gradio 的输出展示组件
HTML:展示HTML内容,适用于富文本或网页布局。JSON:以JSON格式展示数据,便于查看结构化数据。KeyValues:以键值对形式展示数据。Label:展示文本标签,适用于简单的文本输出。Markdown:…...
SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼
概览 用 SwiftUI 框架开发过应用的小伙伴们都知道,SwiftUI 中的视图由各种属性和绑定“扑朔迷离”的缠绕在一起,自成体系。 想要在 Xcode 预览中泰然处之的调试 SwiftUI 视图有时并不是件容易的事。其中,最让人秃头码农们头疼的恐怕就要数如…...
STM32被拔网线 LWIP的TCP无法重连解决方案
目录 一、问题描述 二、项目构成 三、问题解决 1.问题代码 2.解决思路 3.核心代码: 四、完整代码 1.监测网口插入拔出任务 2.TCP任务 3.创建tcp任务 4.删除tcp任务 五、总结 一、问题描述 最近遇到一个问题,就是我的stm32设备作为tcp客户端…...
Linux下开放指定端口
比如需要开放82端口: #查询是否开通 firewall-cmd --query-port82/tcp#开放端口82 firewall-cmd --zonepublic --add-port82/tcp --permanent#重新加载防火墙 firewall-cmd --reload...
亚马逊测评行为的识别与防范:教你如何搭建安全的测评环境
亚马逊平台以其严格的内部系统和精密的买家信息对比机制而闻名。一旦发现买家存在不当评价行为,系统会立即展开深入的调查,追溯其所有的购买和评价记录。如果确认该买家存在补评价的行为,那么他/她之前留下的所有评价都可能会被系统自动删除。…...
如何通过成熟的外发平台,实现文档安全外发管理?
文档安全外发管理是企业信息安全管理的重要组成部分,它涉及到企业向外发送的文件,需要进行严格的控制和管理,防止敏感或机密信息的泄露。以下是一些关键考虑因素: 文件外发的挑战:企业在文件外发时面临的主要挑战包括…...
SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现SSA-CNN-GRU-Multihead-Attention麻雀算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测,要求Matlab2023版以上; 2.输入多个特征,输出单个…...
Mysql中的几种常见日志
引言 本文是对Mysql中几种常见日志及其作用的介绍 一、error log(错误日志) MySQL 中的 error log(错误日志)是一种非常重要的日志类型,它记录了 MySQL 服务器在启动、运行及关闭过程中遇到的所有重要事件、错误信…...
2024年7月22日(nfs samba)
一、webserver 服务器:作用是发布nginx的web项目 1、安装nginx(只下载不安装) [rootweb_server ~]# yum -y install --downloadonly --downloaddir./soft/ nginx 2、配置一个本地的nginx仓库 [rootweb_server ~]# yum -y install createrepo…...
黑龙江网络安全等级保护测评策略概述
一、简介 黑龙江省网络安全等级保护测评策略是为了保障信息系统安全稳定运行,根据《网络安全法》和相关国家标准制定的综合性安全评估和加固过程。该策略不仅要求企业和机构明确自身信息系统的安全等级,还指导其实施相应的技术防护与管理措施࿰…...
笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()
(57)接着介绍另一个读盘块的函数 bread,以及释放 bh 的函数 brelse( ): (58)因为 函数 get_blk()大量调用了其它函数,一版面列举不完,…...
vscode配置latex环境制作【文档、简历、resume】
vscode配置latex环境制作【文档、简历、resume】 1. 安装Tex Live及vscode插件 可以参考:vscode配置latex环境制作beamer ppt 2. 添加vscode配置文件 打开vscode,按下Ctrl Shift P打开搜索框,搜索Preference: Open User Settings (JSON…...
如何学习Spark:糙快猛的大数据之旅
作为一名大数据开发者,我深知学习Spark的重要性。今天,我想和大家分享一下我的Spark学习心得,希望能够帮助到正在学习或准备学习Spark的朋友们。 目录 Spark是什么?学习Spark的"糙快猛"之道1. 不要追求完美,在实践中学习2. 利用大模型作为24小时助教3. 根据自己的节…...
交换机(Switches)和桥(Bridges)的区别
交换机(Switches)和桥接器(Bridges)在网络和通信领域中都起着重要作用,它们有一些共同点,但也有一些显著的区别: 工作层次: 桥接器(Bridges):桥接…...
基于springboot+vue的汽车租赁管理系统
摘要 在当今快速发展的数字化时代,汽车租赁行业作为现代服务业的重要组成部分,正面临着前所未有的机遇与挑战。为提升管理效率、优化用户体验并促进业务增长,我们设计并实现了一套基于Spring Boot后端框架与Vue.js前端技术的汽车租赁管理系统…...
《0基础》学习Python——第二十二讲__网络爬虫/<5>爬取豆瓣电影封面图
一、爬取豆瓣电影的图片封面 1、经过上节课我们所爬取的豆瓣电影的电影名、年份、国家、导演、主演、剧情,那么接下来我们将学习如何去爬取这些电影的图片,并将这些图片存放在文件夹中。 2、过程实现: 2.1、获取网页源码 首先还是和爬取电影名…...
全新UI自助图文打印系统小程序源码/自助云打印机前后端源码
全新UI自助图文打印系统小程序源码,自助云打印机前后端源码。最新的自助图文打印系统和证件照云打印小程序源码采用了PHP作为后端开发语言,旨在为用户提供全面的自助打印服务。 这些服务覆盖了多种文件格式,包括文档、图片、表格等。除此之外…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
