二分查找 | 二分模板 | 二分题目解析
1.二分查找
二分查找的一个前提就是要保证数组是有序的(不准确)!利用二段性!
1.朴素二分模板
朴素二分法的查找中间的值和目标值比较
while(left <= right) // 注意是要: <=
{int mid = left + (right -left) / 2; // 避免溢出if(条件){left = mid + 1;}else if(条件){right = mid -1;}else{return 结果;}
}
练习题目:
leetcode704. 二分查找
leetcode33 搜索旋转排序数组

1、nums[mid] >= nums[left] (以左端点为参考点)说明mid 落在的AB 端 否则落在了CD段
2、当mid落在AB段中,当 target >= nums[left] (以左端点为参考点)&& target < nums[mid] 说明了right = mid -1。否则就是落在了[mid + 1,B]段,移动left = mid + 1;
3、当mid落在了CD段中,当 target <= nums[right](以右端点为参考点) && target > nums[mid] 说明移动left = mid -1。否则right = mid - 1
2.查找左右边界的二分模板
这个模板也可以解决第一个模板的题,他比较万能。
左边界模板
while(left < right)
{int mid = left + (right - left) / 2;if(条件) left = mid + 1;else right = mid;
}
右边界模板
while(left < right)
{int mid = left + (right - left + 1) / 2;if(条件) left = mid;else right = mid -1;
}
leetcode162 寻找峰值
峰值大于相邻的左和右,mid可以是落在任何位置。这里用到了查找右边界的二分模板
1、当nums[mid] > nums[mid -1] 说明是在递增left 往右移动。left = mid (这里只判断了mid 的左边,mid可能就是峰值)
2、else (即:nums[mid] < nums[mid - 1] ) 说明在递减区域如BC。right = mid - 1。

参考代码:
int findPeakElement(vector<int>& nums)
{if(nums.size() == 1) return 0;if(nums.size() < 3) return nums[1] > nums[0] ? 1 : 0;int left = 0,right = nums.size() -1;while(left < right){int mid = left + (right - left+ 1) / 2;if(nums[mid] > nums[mid -1]) {left = mid;}else{right = mid - 1;}}return left;
}
leetcode35 搜索插入位置
找到数组中的元素,如过找不到,返回target插入的下标索引。

如上图数组的左边部分的元素是 <target,右边>= target
1、nums[mid] < target 说明 left = mid + 1
2、nums[mid] >= target 说明 right = mid。有可能mid就是要找的元素
3、当循环结束后(left == right)说明数组中的值没有对应的target。当nums[left] < target。说明target要插入在left后面返回 left + 1 否则返回 left。
参考代码:
int searchInsert(vector<int>& nums, int target)
{int left = 0,right = nums.size() -1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] == target) return mid;if(nums[mid] < target){left = mid + 1;}else{right = mid;}}return nums[left] < target ? left +1 : left;
}
leetcode34、在排序数组中查找元素的第一个和最后一个位置
找到最左边的(第一个位置):

1、当nums[mid] < target则left = mid + 1
2、当nums[mid] >= target 则right = mid (mid可能就是最左边的target)
找到最右边的(最后一个位置):

1、当nums[mid] > target 则right = mid - 1
2、当nums[mid] <= target 则 left = mid
参考代码:
vector<int> searchRange(vector<int>& nums, int target)
{if(nums.size() == 0) return {-1,-1};vector<int> ret;int left = 0, right = nums.size() -1;while(left < right){int mid = left + (right -left) / 2;if(nums[mid] < target){left = mid + 1;}else{right = mid;}}nums[left] == target ? ret.push_back(left) : ret.push_back(-1);left = 0; // 可以的不用重置right = nums.size() -1;while(left < right){int mid = left + (right - left + 1) / 2;if(nums[mid] > target){right = mid - 1;}else{left = mid;}}nums[right] == target ? ret.push_back(left): ret.push_back(-1);return ret;
}
leetcode153. 寻找旋转排序数组中的最小值

1、求最小值,一定是在CD段的,准确说是端点C!但是mid可能会AB段,当落到AB就要移动left,什么条件满足移动呢(参考点是什么)
2、当 nums[mid] > nums[right] 时 left = mid - 1
3、当 nums[mid] <= nums[right] 时 right = mid
int findMin(vector<int>& nums)
{int left = 0,right = nums.size() -1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] > nums[right]){left = mid + 1;}else{right = mid;}}return nums[left];
}
相关文章:
二分查找 | 二分模板 | 二分题目解析
1.二分查找 二分查找的一个前提就是要保证数组是有序的(不准确)!利用二段性! 1.朴素二分模板 朴素二分法的查找中间的值和目标值比较 while(left < right) // 注意是要: < {int mid left (right -left) / 2;…...
uni-app应用更新(Android端)
关于app更新,uni-app官方推荐的是 uni-upgrade-center,看了下比较繁琐,因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端,…...
JavaEE(2):前后端项目之间的交互
现在,在网页中通过超链接,表单就可以向后端发送请求,后端也可以正常响应内容。 以前通过表单访问后端的请求方式称为同步请求 同步请求 当网页与后端交互时,前端不能再进行其他操作 服务器端响应回来的内容,会把整个浏…...
(已开源-CVPR 2024)YOLO-World: Real-Time Open-Vocabulary Object Detection
169期《YOLO-World Real-Time Open-Vocabulary Object Detection》 You Only Look Once (YOLO) 系列检测模型是目前最常用的检测模型之一。然而,它们通常是在预先定义好的目标类别上进行训练,很大程度上限制了它们在开放场景中的可用性。为了解决这一限制…...
Spring6梳理4——SpringIoC容器
以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 4.1 前言 4.2 IoC容器 4.2.1 控制反转(IoC) 4.2.2 依赖注入 4.2.3 IoC容器在Spri…...
SpringBoot2:请求处理原理分析-FORM表单请求接口
一、RESTFUL简介 Rest风格支持(使用HTTP请求方式,动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改…...
Monkey日志ANR、CRASH、空指针异常及其他异常数据分析
引言 在Android开发过程中,monkey测试是一种常用的随机测试手段,用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息,包括应用程序崩溃(Crash)、无响应(ANR&…...
Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区
在Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区(甚至到更细分的级别,如街道、小区等)的联动选择是一个常见的需求。Element Plus的Cascader组件非常适合这样的场景,因为它…...
使用卫星仿真软件STK的一些应用和思考(星地链路、星间链路)
目录 任务描述利用STK建模星地协同系统3个GEO高轨卫星240/20/1 Walker-Star Constellation 低轨卫星星座地面站或者地面设备 链路建模与数据提取处理星地链路星间链路数据读取的几种方法最麻烦的方法使用Matlab与STK互联接口使用大规模使用Chain 总结 任务描述 在一个星地协同…...
pytorch对不同的可调参数,分配不同的学习率
在 PyTorch 中,你可以通过为优化器传递不同的学习率来针对不同的可调参数分配不同的学习率。这通常通过向优化器传递一个字典列表来实现,其中每个字典指定特定参数组的学习率。下面是一个示例代码,展示了如何实现这一点: import …...
零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍
1. time模块 time():获取当前时间戳,是一个数字 localtime():返回一个time.struct_time对象,里面有年月日时分秒,还有星期几(0表示星期一)和今年的第几天 import timeprint(time.time()) pri…...
快速回顾-HTML5
HTML5-常用的标签:https://blog.csdn.net/TKOP_/article/details/111395865 <!-- HTML5:声明文档类型的标签 --> <!DOCTYPE html><!-- 用于声明网页的主要语言为简体中文 --> <!-- 帮助搜索引擎、浏览器等理解网页的语言内容,以便…...
视频技术未来展望:EasyCVR如何引领汇聚融合平台新趋势
随着科技的飞速发展,视频技术已成为现代社会不可或缺的一部分,广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。本文将探讨视频技术的未来发展趋势,并深入分析TSINGSEE青犀EasyCVR视频汇聚融合平台的技术优势,展现其…...
7个流行的开源数据治理工具
数字化时代,数据是已经成为最宝贵的资产之一。数据支撑着我们的政府、企业以及各类组织的所有流程,并为决策以及智能化服务提供支撑。大数据有大用途,但是也可能隐藏着巨大的风险,特别是如果我们对数据的情况不是很了解的时候&…...
js | XMLHttpRequest
是什么? 和serve交互数据的对象;能够达到页面部分刷新的效果,也就是获取数据之后,不会使得整个页面都刷新;虽然名字是XML,但不限于XML数据。 怎么用? function reqListener() {console.log(thi…...
2024国赛数学建模A题思路模型代码
2024国赛数学建模思路资料,思路获取见文末名片 数学建模感想 纪念逝去的大学数学建模:两次校赛,两次国赛,两次美赛,一次电工杯。从大一下学期组队到现在,大三下学期,时间飞逝,我的…...
使用SVD(奇异值分解)进行降维的奇妙之旅
在数据分析和机器学习的广阔天地中,降维技术占据着举足轻重的地位。当我们面对高维数据时,不仅计算成本高昂,而且容易遭遇“维度灾难”,即随着维度的增加,数据的稀疏性和距离度量失效等问题愈发严重。为了克服这些挑战…...
【C++ 第二十一章】特殊类的设计(学习思路)
1.请设计一个类,不能被拷贝 设计思路 拷贝只会使用在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 的做法 将拷贝构造函数与赋值运算符…...
Java设计模式【命令模式】-行为型
1. 介绍 命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使我们可以用不同的请求对客户端进行参数化,并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与…...
【HarmonyOS】一键扫码功能
【HarmonyOS】一键扫码功能 前言 鸿蒙在api10之后,对系统api的基础上,封装了较为复杂功能的开发工具包,统一称之为Kit。这些Kit根据功能定义的不同,划分为不同的种类Kit。如下图所示: 其实可以理解为集成在系统中的…...
2026年冷干机十大品牌深度测评:从能效到服务的工业级选型指南
冷冻式干燥机(冷干机)作为压缩空气系统的“水分守门员”,直接影响工业生产的稳定性——食品加工的卫生级空气、电子制造的低露点要求、化工行业的腐蚀防护,都依赖冷干机的可靠运行。对于处于购买阶段的企业而言,选型的…...
AI Coding越来越强,我们还有必要学Processing吗? · 创意编程嚼
故障表现 发现请求集群 demo 入口时卡住,并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...
[特殊字符] 第87课:股票含冷冻期
想系统提升编程能力、查看更完整的学习路线,欢迎访问 AI Compass:https://github.com/tingaicompass/AI-Compass 仓库持续更新刷题题解、Python 基础和 AI 实战内容,适合想高效进阶的你。📖 第87课:股票含冷冻期模块:动态规划 | 难…...
从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具淌
我为什么会发出这个疑问呢?是因为我研究Web开发中的一个问题时,HTTP请求体在 Filter(过滤器)处被读取了之后,在 Controller(控制层)就读不到值了,使用 RequestBody 的时候。 无论是字…...
太阳能监控哪家强?商用品牌大揭秘,省钱省心这样选!
在工商业安防、交通管理、野外监测等领域,太阳能监控系统以其无需市电、部署灵活、绿色节能的优势,正成为解决偏远无电区域监控难题的首选方案。然而,面对市场上琳琅满目的品牌和产品,如何选择一个真正“强”且适合商用场景的解决…...
OpenClaw技能市场挖掘:百川2-13B-4bits量化版适配插件精选
OpenClaw技能市场挖掘:百川2-13B-4bits量化版适配插件精选 1. 为什么需要专门适配百川模型的技能? 去年冬天第一次尝试用OpenClaw对接百川2-13B模型时,我遇到了一个典型问题:虽然模型本身运行良好,但很多现成的技能模…...
Programmable-Air开源气动控制库底层驱动解析
1. Programmable-Air 开源控制库深度解析:面向嵌入式工程师的底层驱动实践指南Programmable-Air 是一款基于 Crowdfunding 平台 CrowdSupply 成功孵化的开源气动控制硬件平台,其核心价值在于将传统工业级气动执行器(泵、阀、压力传感器&#…...
你的终端神器之Oh My Zsh刨
1.安装环境准备 1.1.查看物理内存 [rootaiserver ~]# free -m 1.2.操作系统版本 [rootaiserver ~]# cat /etc/redhat-release 1.3.操作系统内存 [rootaiserver ~]# df -h /dev/shm/ 1.4.磁盘空间 [rootaiserver ~]# df -TH [rootaiserver ~]# df -h /tmp/ [rootaiserver ~]# d…...
超流体真空理论:光速本质、微观粒子结构与量子纠缠拓扑机制
摘要本文基于超流体真空理论框架,揭示狭义相对论洛伦兹变换的物理本源,诠释光速不变的底层形成机制,明确微观基本粒子的真空结构起源;同时提出原创性量子纠缠拓扑结构模型,定义纠缠传态的速度极限与物理机制࿰…...
从心所欲不逾矩:一种自感澄明的儒家工夫现象学——兼论“自我即自感”与儒家心性论的对话
从心所欲不逾矩:一种自感澄明的儒家工夫现象学——兼论“自我即自感”与儒家心性论的对话岐金兰摘要本文以“自我即自感”理论为现象学视域,对孔子“七十而从心所欲不逾矩”的生命境界进行创造性重诠。核心论点为:此境界并非道德规范的内化&a…...
