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;}
};
相关文章:
![](https://i-blog.csdnimg.cn/direct/c6b876d1fac64e309368e6abc1b91eae.jpeg)
Leetcode二分搜索法浅析
文章目录 1.二分搜索法1.1什么是二分搜索法?1.2解法思路1.3扩展 1.二分搜索法 题目原文: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值…...
![](https://i-blog.csdnimg.cn/direct/4731906b08df4925aaf1e1ce1e85bc3e.png)
昇思25天学习打卡营第24天|ResNet50迁移学习
课程打卡凭证 迁移学习 迁移学习是机器学习中一个重要的技术,通过在一个任务上训练的模型来改善在另一个相关任务上的表现。在深度学习中,迁移学习通常涉及在一个大型数据集(如ImageNet)上预训练的模型上进行微调,以便…...
![](https://www.ngui.cc/images/no-images.jpg)
Shell 构建flutter + Navtive 生成IPA
具体实现: #1. 在工程的根目录下,建立文件夹build_iOS文件,在此文件下建立build_iOS.sh的文件,把以下内容copy进sh文件;build_iOS.sh 就是第5步之后整个的脚本内容。 #2. 进入build_iOS.sh 文件的目录; #3. 在build_iOS 文件夹配置打包的DEVELOPExportOptionsPlist…...
![](https://i-blog.csdnimg.cn/direct/5dc126602e5649fea4491433a9a35f09.png)
python gradio 的输出展示组件
HTML:展示HTML内容,适用于富文本或网页布局。JSON:以JSON格式展示数据,便于查看结构化数据。KeyValues:以键值对形式展示数据。Label:展示文本标签,适用于简单的文本输出。Markdown:…...
![](https://i-blog.csdnimg.cn/direct/9f09ac995e034f78af6a499e15815dc1.gif#pic_center)
SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼
概览 用 SwiftUI 框架开发过应用的小伙伴们都知道,SwiftUI 中的视图由各种属性和绑定“扑朔迷离”的缠绕在一起,自成体系。 想要在 Xcode 预览中泰然处之的调试 SwiftUI 视图有时并不是件容易的事。其中,最让人秃头码农们头疼的恐怕就要数如…...
![](https://i-blog.csdnimg.cn/direct/5981d30a3e5d42109e345299a5f9357e.png)
STM32被拔网线 LWIP的TCP无法重连解决方案
目录 一、问题描述 二、项目构成 三、问题解决 1.问题代码 2.解决思路 3.核心代码: 四、完整代码 1.监测网口插入拔出任务 2.TCP任务 3.创建tcp任务 4.删除tcp任务 五、总结 一、问题描述 最近遇到一个问题,就是我的stm32设备作为tcp客户端…...
![](https://i-blog.csdnimg.cn/direct/730d147e3fb94409b7dfd9cf8164ecbd.png)
Linux下开放指定端口
比如需要开放82端口: #查询是否开通 firewall-cmd --query-port82/tcp#开放端口82 firewall-cmd --zonepublic --add-port82/tcp --permanent#重新加载防火墙 firewall-cmd --reload...
![](https://i-blog.csdnimg.cn/direct/2dbb30126c29448faaa52a73f5277cb9.jpeg)
亚马逊测评行为的识别与防范:教你如何搭建安全的测评环境
亚马逊平台以其严格的内部系统和精密的买家信息对比机制而闻名。一旦发现买家存在不当评价行为,系统会立即展开深入的调查,追溯其所有的购买和评价记录。如果确认该买家存在补评价的行为,那么他/她之前留下的所有评价都可能会被系统自动删除。…...
![](https://img-blog.csdnimg.cn/img_convert/7f0540ac8ea25025bbecfb21671134bc.jpeg)
如何通过成熟的外发平台,实现文档安全外发管理?
文档安全外发管理是企业信息安全管理的重要组成部分,它涉及到企业向外发送的文件,需要进行严格的控制和管理,防止敏感或机密信息的泄露。以下是一些关键考虑因素: 文件外发的挑战:企业在文件外发时面临的主要挑战包括…...
![](https://i-blog.csdnimg.cn/direct/1397b511b00142d9bad3ba90beae537a.png)
SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现SSA-CNN-GRU-Multihead-Attention麻雀算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测,要求Matlab2023版以上; 2.输入多个特征,输出单个…...
![](https://i-blog.csdnimg.cn/direct/c4f63e9e13ad42458b402b05817e5983.png)
Mysql中的几种常见日志
引言 本文是对Mysql中几种常见日志及其作用的介绍 一、error log(错误日志) MySQL 中的 error log(错误日志)是一种非常重要的日志类型,它记录了 MySQL 服务器在启动、运行及关闭过程中遇到的所有重要事件、错误信…...
![](https://i-blog.csdnimg.cn/direct/a35721bc5cd14be4b825165f55b65adb.png)
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…...
![](https://www.ngui.cc/images/no-images.jpg)
黑龙江网络安全等级保护测评策略概述
一、简介 黑龙江省网络安全等级保护测评策略是为了保障信息系统安全稳定运行,根据《网络安全法》和相关国家标准制定的综合性安全评估和加固过程。该策略不仅要求企业和机构明确自身信息系统的安全等级,还指导其实施相应的技术防护与管理措施࿰…...
![](https://i-blog.csdnimg.cn/direct/7301175dfbf44e4789d623949e598561.png)
笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()
(57)接着介绍另一个读盘块的函数 bread,以及释放 bh 的函数 brelse( ): (58)因为 函数 get_blk()大量调用了其它函数,一版面列举不完,…...
![](https://i-blog.csdnimg.cn/direct/64d2c43622ed4823aefce45cb858dcda.png)
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…...
![](https://img-blog.csdnimg.cn/img_convert/eaa027c3ec8c2d0b05f5e8cd7652ac50.png)
如何学习Spark:糙快猛的大数据之旅
作为一名大数据开发者,我深知学习Spark的重要性。今天,我想和大家分享一下我的Spark学习心得,希望能够帮助到正在学习或准备学习Spark的朋友们。 目录 Spark是什么?学习Spark的"糙快猛"之道1. 不要追求完美,在实践中学习2. 利用大模型作为24小时助教3. 根据自己的节…...
![](https://www.ngui.cc/images/no-images.jpg)
交换机(Switches)和桥(Bridges)的区别
交换机(Switches)和桥接器(Bridges)在网络和通信领域中都起着重要作用,它们有一些共同点,但也有一些显著的区别: 工作层次: 桥接器(Bridges):桥接…...
![](https://i-blog.csdnimg.cn/direct/ca7fe41bbfe548d59ea03f242c1091ba.png)
基于springboot+vue的汽车租赁管理系统
摘要 在当今快速发展的数字化时代,汽车租赁行业作为现代服务业的重要组成部分,正面临着前所未有的机遇与挑战。为提升管理效率、优化用户体验并促进业务增长,我们设计并实现了一套基于Spring Boot后端框架与Vue.js前端技术的汽车租赁管理系统…...
![](https://i-blog.csdnimg.cn/direct/b8565e99d0d44b01b7b6373c4d545818.png)
《0基础》学习Python——第二十二讲__网络爬虫/<5>爬取豆瓣电影封面图
一、爬取豆瓣电影的图片封面 1、经过上节课我们所爬取的豆瓣电影的电影名、年份、国家、导演、主演、剧情,那么接下来我们将学习如何去爬取这些电影的图片,并将这些图片存放在文件夹中。 2、过程实现: 2.1、获取网页源码 首先还是和爬取电影名…...
![](https://img-blog.csdnimg.cn/img_convert/040bb58c9fdfaeedb4be7c04f1d6184c.jpeg)
全新UI自助图文打印系统小程序源码/自助云打印机前后端源码
全新UI自助图文打印系统小程序源码,自助云打印机前后端源码。最新的自助图文打印系统和证件照云打印小程序源码采用了PHP作为后端开发语言,旨在为用户提供全面的自助打印服务。 这些服务覆盖了多种文件格式,包括文档、图片、表格等。除此之外…...
![](https://i-blog.csdnimg.cn/direct/f84b757854684ff78e4529d370727da2.png)
yolo5图片视频、摄像头推理demo
yolo5图片、视频推理demo 图片 import torch# 加载预训练模型 model torch.hub.load(./yolo5, custom, pathyolov5s.pt, sourcelocal)# 加载图片 img 1.jpg# 进行推理 results model(img)# 解析结果 detections results.xyxy[0].cpu().numpy() # [x1, y1, x2, y2, confid…...
![](https://www.ngui.cc/images/no-images.jpg)
Scala学习笔记19: 隐式转换和隐式参数
目录 第十九章 隐式转换和隐式参数1- 隐式转换1. 隐式准换函数: 施展魔法的咒语2. 隐式类: 为已有类型添加魔法3. 隐式转换规则: 魔法生效的条件4. 举例说明: 见证魔法的时刻5. 注意事项: 谨慎使用魔法 2. 隐式参数1. 语义: 隐藏在背后的参数2. 使用 隐式参数的方式2.1 隐式值:…...
![](https://i-blog.csdnimg.cn/direct/e29902c47f984e469be187b66783669d.png)
用户登录安全是如何保证的?如何保证用户账号、密码安全?
1.HTTP协议直接传输密码(无加密) 前端 直接发送HTTP请求(无加密),攻击者可直接捕获网络包,看到下面的明文信息 因此,使用HTTP协议传输会直接暴露用户敏感信息。 2.HTTPS协议直接传输密码&…...
![](https://i-blog.csdnimg.cn/direct/24d83698bea141748c5b86172d44af31.png)
Java 写一个可以持续发送消息的socket服务端
前言 最近在学习flink, 为了模仿一个持续的无界的数据源, 所以需要一个可以持续发送消息的socket服务端. 先上效果图 效果图 socket服务端可以持续的发送消息, flink端是一个统计单词出现总数的消费端,效果图如下 源代码 flink的消费端就不展示了, 需要引入一些依赖和版本…...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu2204搭建ceph17
Ceph 环境初始化搭建Ceph 本次实验基于VMware17 节点IPstorage01192.168.200.161storage01192.168.200.162storage01192.168.200.163 环境初始化 初始化基础环境,三节点执行 #!/bin/bash# 定义节点信息 NODES("192.168.200.161 storage01 root" "…...
![](https://www.ngui.cc/images/no-images.jpg)
Druid 面试题及答案整理,最新面试题
Druid连接池在项目中有哪些优势? 1、高性能: Druid连接池在性能方面进行了大量优化,可以快速回收和分配数据库连接,减少数据库访问延迟。 2、实时监控: 提供Druid Monitor监控功能,可以实时监控数据库访问性能和连接池状态,便于及时发现和解决问题。 3、扩展性强: 支持…...
![](https://img-blog.csdnimg.cn/direct/f777be6a8ef441209ffadc9ef4b298b6.png)
数据库基础与安装MYSQL数据库
一、数据库管理系统DBMS 数据库技术是计算机科学的核心技术之一,具有完备的理论基础。使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便地管理数据 1.可以结构化存储大量的数据信息,方便用户进行有效的检索和访问 2.可以…...
![](https://i-blog.csdnimg.cn/direct/cc29a41c6d3a485682a00b5bab2467af.png)
昇思25天学习打卡营第18天| DCGAN生成漫画头像
DCGAN,全称深度卷积对抗生成网络(Deep Convolutional Generative Adversarial Networks),是一种通过对抗训练生成图像的技术。它在判别器和生成器中都使用了卷积和转置卷积层。 训练分为两个部分:训练判别器和训练生成…...
![](https://img-blog.csdnimg.cn/0e353dbce8a0404fb3e658f70ce19748.png)
【面试八股文】计算机操作系统
参考:大佬图解文章 → 小林coding 简介:之前在学习小林大佬的八股文时,摘录了一些个人认为比较重要的内容,方便后续自己复习。【持续更新ing ~💯】 注:加五角星标注的,是当前掌握不牢固的&…...
![](https://www.ngui.cc/images/no-images.jpg)
宝塔Wordpress 插件 Redis object cache 导致内存很高 80%以上的原因和解决
查看内存前X 使用以下命令查看前10,修改10数字即可查看前X ps aux | head -1;ps aux |grep -v PID |sort -rn -k 4 | head -10 查看cpu占用 查看前10 ps aux | head -1;ps aux |grep -v PID |sort -rn -k 3 | head -10 原因是 4GiB 内存的服务器,Redis会…...
![](/images/no-images.jpg)
动态网站制作软件/网站推广系统方案
M. Big brother said the calculation 通过线段树维护。 这个题和杭电的一道题几乎就是一样的题目。HDU5649.DZY Loves Sorting 题意就是一个n的排列,执行Q次操作,每次操作是对某个区间从小到大排序或者从大到小排序。最后只查询一次,输出第k…...
![](https://img2018.cnblogs.com/blog/1498309/201903/1498309-20190310101856446-2062960875.png)
搭建电商网站/网店网络营销与推广策划书
转载于:https://www.cnblogs.com/zq-dmhy/p/10504488.html...
![](https://img-blog.csdnimg.cn/img_convert/0b1331709591d260c1c78e86d0c51c18.png)
天津和平做网站哪家好/软文营销的步骤
代码托管1.首先去注册一个github的账号吧:github.com。2.下载github mac客户端:http://mac.github.com(windows客户端:http://windows.github.com,我这里只介绍mac下的,win下还没试过,不过我想方法应是一样…...
![](/images/no-images.jpg)
潍坊网站的公司电话/seo查询seo
一,利用网站浏览器F12键,利用谷歌浏览器插件找到视频的.m3u8文件,并打开。 二,打开m3u8文件后,里面有很多.ts的链接,和key的链接。 三,保存为html文件,下载ts文件,代码如…...
![](/images/no-images.jpg)
成人做视频在线观看网站/十种营销方式
用了IDLE, PythonWin等几个python编辑器,在代码补全、参数提示等功能上都非常不满意。 终于找到PyScripter并且试用了一下,代码补全、参数提示等功能非常强大。这个功能其实非常重要,可以大大提高开发效率,减少出错。很满意.PyScr…...
![](/images/no-images.jpg)
福州建设工程造价信息网/seo和sem的区别
ES6中的扩展运算符拷贝问题以及常用的深浅拷贝方法 在ES6中新增了扩展运算符可以对数组和对象进行操作。有时候会遇到数组和对象的拷贝,可能会用到扩展运算符。那么这个扩展运算符到底是深拷贝还是浅拷贝呢? 一.、使用扩展运算符拷贝 首先是下面的代码…...