当前位置: 首页 > article >正文

算法篇:二分查找

目录介绍查找数组中值算法模板左右边界模板实例二分查找easy在排序数组中查找元素的第一个和最后一个medium搜索插入位置easyx 的平方根easy山峰数组的峰顶easy寻找峰值medium搜索旋转排序数组中的最小值medium0〜n-1 中缺失的数字easy介绍核心思想每次都通过比较中间元素将查找范围缩小一半直到找到目标或确认目标不存在。必要条件数据结构一定要是有序的升序或降序支持随机访问如数组、列表链表不适合查找数组中值算法模板左右边界模板左边界右边界如何确定题目到底是用哪个边界的算法呢可以直接假设mid在我们想找的答案上然后根据上面的模板和判断条件的要求看看要缩小那一边的区域。左边界找的是满足判断条件的第一个数右边界是找满足条件的第二个数实例二分查找easy704. 二分查找 - 力扣LeetCode该题目中的数组是升序的可以考虑用二分查找。算法流程a. 定义 left right 指针分别指向数组的左右区间。b. 找到待查找区间的中间点 mid 找到之后分三种情况讨论arr[mid] target 说明正好找到返回 mid 的值arr[mid] target 说明 [mid, right] 这段区间都是大于 target 的因此舍去右边区间在左边 [left, mid -1] 的区间继续查找即让 right mid -1 然后重复 2 过程arr[mid] target 说明 [left, mid] 这段区间的值都是小于 target 的因此舍去左边区间在右边 [mid 1, right] 区间继续查找即让 left mid 1 然后重复 2 过程c. 当 left 与 right 错开时说明整个区间都没有这个数返回 -1 。class Solution { public: int search(vectorint nums, int target) { int left0,rightnums.size()-1; while(leftright)//// 由于两个指针相交时当前元素还未判断因此需要取等号 { int midleft(right-left)/2; if(nums[mid]target)leftmid1; else if (nums[mid]target)rightmid-1; else return mid; } return -1; } };在排序数组中查找元素的第一个和最后一个medium34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣LeetCode题目解析在一个升序数组中找到一段全是目标值的区间返回全是目标值的第一个下标和最后一个目标值的下标。假设左边界下标是resleft目标值为x右边界下标为resright寻找左边界思路根据左边界进行划分成两个区域[left,resleft-1]都是小于x的[resleft,right]都是大于等于x的因此根据mid的落点我们可以分为两个情况当mid落在[left,resleft-1]区域内是即nums[mid]x,那么这个区域内的值是可以全部舍去的所以让leftmid1,继续在[mid1right]中寻找左边界当mid落在[resleftright]区域内即nums[mid]x,说明[mid1,right]可以舍去但mid位置可能是最终结果所以right更新成mid继续在[left,mid]中寻找左边界寻找右边界思路根据右边界进行划分成两个区域[left,resright]都是小于等于x的[resright1,right]都是大于x的因此根据mid的落点我们可以分成两种情况当mid落在[left,resright]区域内是即nums[mid]x,那么[left,mid-1]的值是可以全部舍去的但mid位置可能是最终结果,所以让leftmid,继续在[midright]中寻找右边界当mid落在[resright1right]区域内即nums[mid]x,说明[mid,right]可以舍去所以right更新成mid-1继续在[left,mid-1]中寻找右边界细节部分中间值有两种取法midleft(right-left)/2 //向下取整midleft(right-left1)/2//向上取整当left和right即将相遇时可能出现死循环寻找左边界时假设left1,right2,leftmid1,rightmid,如果midleft(right-left1)/2那么mid2因为rightmid导致一直right都没有向前走一步让leftright让循环结束所以我们寻找左边界的时候要向下取整。同理可得右边界class Solution { public: vectorint searchRange(vectorint nums, int target) { int left0,rightnums.size()-1; if(nums.size()0)return {-1,-1}; while(leftright) { int midleft(right-left)/2; if(nums[mid]target)leftmid1; else rightmid; } int begin-1; if(nums[left]!target) return {-1,-1}; else beginleft; left0,rightnums.size()-1; while(leftright) { int midleft(right-left1)/2; if(nums[mid]target) leftmid; else rightmid-1; } return {begin,right}; } };搜索插入位置easy35. 搜索插入位置 - 力扣LeetCode题目解析在一个升序数组中找到target的下标如果target不存在就返回它在数组中处在什么下标可以让数组依旧是升序所在的下标。根据第二个案例假设mid在下标为1的地方然后当前数组中的下标为1的数大于target32)判断条件是nums[mid]与target的关系32,说明题意要求的值在左边所以可以直接舍去右边的值这时候就是right移动right有两种移动一个是rightmid,另一个是rightmid-1。如果选择第二个那么正确答案就被排除在外了所以选第一个第一个在左右边界模板中寻找左边界模板。解题思路假设target所在数组中的下标是i那么我们可以把数组分为两个区域[left,i-1]:全部小于target;[i,right]都是大于等于target根据这个区域划分我们可以知道其实这个题相当于找左边界。因此根据mid的落点我们可以分为两个情况当mid落在[left,i-1]区域内是即nums[mid]x,那么这个区域内的值是可以全部舍去的所以让leftmid1,继续在[mid1right]中寻找当mid落在[iright]区域内即nums[mid]x,说明[mid1,right]可以舍去但mid位置可能是最终结果所以right更新成mid继续在[left,mid]中寻找class Solution { public: int searchInsert(vectorint nums, int target) { int left0,rightnums.size(); while(leftright) { int midleft(right-left)/2; if(nums[mid]target) leftmid1; else rightmid; } return right; } };x 的平方根easy69. x 的平方根 - 力扣LeetCode题目解析找出x的平方根即给x开根号如果x开根号后有小数就只保留整数。根据第二个案例假设mid在等于2的地方然后当前数组中的2*2的数小于target48)找的值在右边所以舍去左边的值这时候就是left移动left有两种移动一个是leftmid,另一个是leftmid1。如果选择第二个那么正确答案就被排除在外了所以选第一个第一个在左右边界模板中寻找右边界模板。解题思路假设x的最终平方根结果是index把区域划分为两部分[left,index]的平方根全部都是小于等于x的[index1,right]的平方根全部大于x具有二分性因此根据mid的落点我们可以分成两种情况当mid落在[left,i]区域内是即nums[mid]x,那么[left,mid-1]的值是可以全部舍去的但mid位置可能是最终结果,所以让leftmid,继续在[midright]中寻找当mid落在[i1right]区i域内即nums[mid]x,说明[mid,right]可以舍去所以right更新成mid-1继续在[left,mid-1]中寻找class Solution { public: int mySqrt(int x) { long long left1,rightx; if(x0)return 0; while(leftright) { long long midleft(right-left1)/2; if(mid*midx)leftmid; else rightmid-1; } return left; } };山峰数组的峰顶easy852. 山脉数组的峰顶索引 - 力扣LeetCode题目解析在一个先单调递增然后单调递减的数组中找到单调递增的结束的最大值。峰值有个明显特征就是只要比后面的那个数大就是峰值。方法一暴力解法class Solution { public: int peakIndexInMountainArray(vectorint arr) { int n arr.size(); // 遍历数组内每⼀个元素直到找到峰顶 for (int i 1; i n - 1; i) // 峰顶满⾜的条件 if (arr[i] arr[i - 1] arr[i] arr[i 1]) return i; // 为了处理 oj 需要控制所有路径都有返回值 return -1; } };方法二根据峰值所在位置可以把数组分成两部分一部分单调递增一部分单调递减具有二分性。根据第二个案例假设mid在下标为1的地方然后当前数组中的下标为1的数大于后一个数说明目标值在左边前半部分单调递增可以舍去右边的区域这时候就是right移动right有两种移动一个是rightmid,另一个是rightmid-1。如果选择第二个那么正确答案就被排除在外了所以选第一个第一个就是左右边界模板中寻找左边界模板。解题思路假设target所在数组中的下标是i那么我们可以把数组分为两个区域[left,i-1]:全部小于target;[i,right]都是大于等于target根据这个区域划分我们可以知道其实这个题相当于找左边界。因此根据mid的落点我们可以分为两个情况当mid落在[left,i-1]区域内是即nums[mid]x,那么这个区域内的值是可以全部舍去的所以让leftmid1,继续在[mid1right]中寻找当mid落在[iright]区域内即nums[mid]x,说明[mid1,right]可以舍去但mid位置可能是最终结果所以right更新成mid继续在[left,mid]中寻找class Solution { public: int peakIndexInMountainArray(vectorint arr) { int left0,rightarr.size()-1; while(leftright) { int midleft(right-left)/2; if(arr[mid]arr[mid1])rightmid; else leftmid1; } return right; } };寻找峰值medium162. 寻找峰值 - 力扣LeetCode解题方法和上题一样class Solution { public: int findPeakElement(vectorint nums) { int left0,rightnums.size()-1; while(leftright) { int midleft(right-left)/2; if(nums[mid]nums[mid1])rightmid; else leftmid1; } return right; } };搜索旋转排序数组中的最小值medium153. 寻找旋转排序数组中的最小值 - 力扣LeetCode题目解析找一个数组中的最小值。这个数组中有两个都是单调递增的方法一暴力解法一直标记一个最小值进行比较class Solution { public: int findMin(vectorint nums) { int n nums.size(); int minnumINT_MAX; int index-1; // 遍历数组内每⼀个元素直到找到最小值 for (int i 0; i n; i) { if(nums[i]minnum) { minnummin(minnum,nums[i]); indexi; } } return nums[index]; } };方法二二分查找该数组有两部分单调递增具有二分性可以考虑二分查找判断条件的选择分析数组我们发现在最后的一个数的前面的值只有它前面几个数比它小其他都比它大所以我们的判断条件就是和最后一个数比较。左右边界的判断:我们要找的是第一个满足要求的数所以用左边界。解题思路假设target所在数组中的下标是i那么我们可以把数组分为两个区域[left,i-1]:全部小于target;[i,right]都是大于等于target根据这个区域划分我们可以知道其实这个题相当于找左边界。因此根据mid的落点我们可以分为两个情况当mid落在[left,i-1]区域内是即nums[mid]x,那么这个区域内的值是可以全部舍去的所以让leftmid1,继续在[mid1right]中寻找当mid落在[iright]区域内即nums[mid]x,说明[mid1,right]可以舍去但mid位置可能是最终结果所以right更新成mid继续在[left,mid]中寻找class Solution { public: int findMin(vectorint nums) { int left0,rightnums.size()-1; //找最小值 int xnums[right]; while(leftright) { int midleft(right-left)/2; if(nums[mid]x)rightmid; else leftmid1; } return nums[left]; } };0〜n-1 中缺失的数字easyLCR 173. 点名 - 力扣LeetCode题目解析在一个按顺序排列的数组中找缺的数。数组单调递增可以考虑二分查找。方法一暴力解法class Solution { public: int takeAttendance(vectorint records) { if(records.size()1records[0]0)return 1; for(int i0;irecords.size();i) { if(i!records[i])return i; } int nrecords.size()-1; if(nrecords[n]) return n1; else return -1; } };方法二二分查找判断条件可以舍去一部分的条件如果midrecords[mid]是不是说明前面一部分的都没有缺人所以前面一部分可以舍去让leftmid1假设target所在数组中的下标是i那么我们可以把数组分为两个区域[left,i-1]:全部小于target;[i,right]都是大于等于target根据这个区域划分我们可以知道其实这个题相当于找左边界。因此根据mid的落点我们可以分为两个情况当mid落在[left,i-1]区域内是即nums[mid]mid,那么这个区域内的值是可以全部舍去的所以让leftmid1,继续在[mid1right]中寻找当mid落在[iright]区域内即nums[mid]!mid,说明[mid1,right]可以舍去但mid位置可能是最终结果所以right更新成mid继续在[left,mid]中寻找class Solution { public: int takeAttendance(vectorint records) { if(records.size()1records[0]0)return 1; int left0,rightrecords.size()-1; while(leftright) { int midleft(right-left)/2; if(midrecords[mid])leftmid1; else rightmid; } return leftrecords[left]?left1:left; } };

相关文章:

算法篇:二分查找

目录 介绍 查找数组中值算法模板 左右边界模板 实例 二分查找(easy) 在排序数组中查找元素的第一个和最后一个(medium) 搜索插入位置(easy) x 的平方根(easy) 山峰数组的峰…...

保姆级教程:用Go的net/smtp库绕过第三方email包,直连QQ邮箱465端口发邮件

深度解析:如何用Go标准库直连QQ邮箱465端口实现稳定邮件发送 在开发邮件发送功能时,许多Golang开发者会首选第三方封装库如jordan-wright/email,它们提供了简洁的API和便捷的抽象。然而在实际生产环境中,这些封装库可能会遇到一些…...

新手必看!数学建模国赛‘穿越沙漠‘题保姆级通关攻略

数学建模国赛"穿越沙漠"题全维度实战指南 1. 理解题目本质与核心挑战 "穿越沙漠"作为数学建模国赛经典题型,本质上是一个多约束条件下的资源优化问题。我们需要在负重限制、天气变化、资金管理等复杂条件下,找到从起点到终点的最优路…...

基于Lasso分位数回归的多变量时间序列预测 Lasso多变量时间序列 matlab代码, 注

基于Lasso分位数回归的多变量时间序列预测 Lasso多变量时间序列 matlab代码,注:暂无Matlab版本要求 -- 推荐 2018B 版本及以上咱们今天聊聊怎么用Matlab玩转Lasso分位数回归预测多变量时间序列。这事儿听着挺学术,但实际操作起来比想象中有趣…...

如何高效解决网页资源获取难题?猫抓媒体解析工具的技术突破与实用价值

如何高效解决网页资源获取难题?猫抓媒体解析工具的技术突破与实用价值 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在信息爆炸的今天,网页媒体资源已成为学习、工作和娱乐的…...

基于Python的物资综合管理系统毕业设计源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在开发一套基于Python的物资综合管理系统,以实现对物资采购、存储、分配和回收等环节的全面管理。具体研究目的如下:提高物资管理…...

160+功能重构OneNote体验:OneMore插件让笔记效率提升300%的实战指南

160功能重构OneNote体验:OneMore插件让笔记效率提升300%的实战指南 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 作为全球最受欢迎的数字笔记工具之一&a…...

OpenClaw压力测试:Qwen3.5-9B持续工作72小时稳定性报告

OpenClaw压力测试:Qwen3.5-9B持续工作72小时稳定性报告 1. 测试背景与目标 去年夏天,当我第一次在个人笔记本上部署OpenClaw时,最担心的不是功能实现,而是这个"数字员工"能否稳定工作。作为需要7*24小时运行的自动化框…...

深入浅出 LINQ:从传统集合操作到语言集成查询的进化

在 C# 开发中&#xff0c;我们经常需要对内存中的集合&#xff08;如数组、List<T>、Dictionary<TKey, TValue>&#xff09;进行筛选、排序、分组等操作。过去&#xff0c;我们通常使用 foreach 循环、for 循环&#xff0c;或借助委托来实现这些功能。然而&#xf…...

LispMotor:Arduino L298N双H桥电机驱动轻量库

1. 项目概述LispMotor 是一款专为 Arduino 平台设计的 L298x 系列双 H 桥电机驱动芯片的轻量级控制库。其核心目标并非提供抽象层或高级运动规划&#xff0c;而是以嵌入式工程师的务实视角&#xff0c;直击硬件控制本质&#xff1a;精准映射引脚功能、明确 PWM 使能逻辑、暴露底…...

SDRPlusPlus铁路GSM-R信号解析实践指南:从信号捕获到协议分析

SDRPlusPlus铁路GSM-R信号解析实践指南&#xff1a;从信号捕获到协议分析 【免费下载链接】SDRPlusPlus Cross-Platform SDR Software 项目地址: https://gitcode.com/GitHub_Trending/sd/SDRPlusPlus 在现代铁路通信系统中&#xff0c;GSM-R&#xff08;Global System …...

3分钟掌握「阅读」APP书源导入:告别小说断更,实现阅读自由!

3分钟掌握「阅读」APP书源导入&#xff1a;告别小说断更&#xff0c;实现阅读自由&#xff01; 【免费下载链接】Yuedu &#x1f4da;「阅读」APP 精品书源&#xff08;网络小说&#xff09; 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 你是否遇到过这样的情况…...

一个让人上头的数字小游戏:2048到底好玩在哪?

如果你平时喜欢轻量、随开随玩的小游戏&#xff0c;那你大概率已经听说过“2048”。这类游戏没有复杂操作&#xff0c;却非常容易让人一玩就是几十分钟&#xff0c;甚至停不下来。 最近我在体验一个在线版本的时候&#xff0c;重新梳理了一下这个游戏的核心玩法和设计逻辑&…...

如何解决B站m4s格式播放限制:m4s-converter工具全面指南

如何解决B站m4s格式播放限制&#xff1a;m4s-converter工具全面指南 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter B站缓存的视频文件采用特殊的m4s格式存储&#xff0c;导致…...

告别多设备切换烦恼:跨设备协作效率工具Lan Mouse全解析

告别多设备切换烦恼&#xff1a;跨设备协作效率工具Lan Mouse全解析 【免费下载链接】lan-mouse mouse & keyboard sharing via LAN 项目地址: https://gitcode.com/gh_mirrors/la/lan-mouse 在数字化办公环境中&#xff0c;跨平台键鼠共享已成为提升工作效率的关键…...

51单片机智能温控风扇

目录 具体实现功能 设计介绍 51单片机简介 资料内容 原理图和PCB&#xff08;AD19&#xff09; 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部资料 资料获取 具体实现功能 由51单片机DS18B20温度传感器共阳四位数码管风扇独立…...

Meixiong Niannian画图引擎与STM32CubeMX结合:嵌入式AI艺术装置

Meixiong Niannian画图引擎与STM32CubeMX结合&#xff1a;嵌入式AI艺术装置 1. 当硬件遇见艺术&#xff1a;为什么要在STM32上跑AI画图 你有没有想过&#xff0c;一块指甲盖大小的STM32芯片&#xff0c;也能成为艺术创作的画布&#xff1f;不是在云端服务器里调用API&#xf…...

Phi-3-Mini-128K步骤详解:如何验证128K上下文是否真正生效

Phi-3-Mini-128K步骤详解&#xff1a;如何验证128K上下文是否真正生效 你肯定听说过Phi-3-mini-128K支持超长上下文&#xff0c;但你真的确定它用上了吗&#xff1f;很多人在部署完模型后&#xff0c;只是简单聊几句&#xff0c;就默认128K功能已经开启。实际上&#xff0c;如…...

基于Simulink的ABS仿真:PID控制策略的探索

基于Simulink的ABS仿真模型&#xff0c;采用PID控制策略的防抱死制动系统进行仿真分析在汽车安全领域&#xff0c;防抱死制动系统&#xff08;ABS&#xff09;无疑是一项关键技术。它能在制动过程中防止车轮抱死&#xff0c;确保车辆在制动时仍能保持一定的转向操控性&#xff…...

B端拓客中号码核验的困境与技术突围路径氪迹科技法人股东号码筛选系统、阶梯式价格

在B端客户拓展的全流程中&#xff0c;能否精准触达企业核心决策层&#xff0c;直接决定了拓客工作的成效与质量。企业核心决策层&#xff08;法人、股东、董监高等&#xff09;的联系方式&#xff0c;是搭建有效沟通、推动合作达成的关键前提&#xff0c;而号码核验与筛选工作&…...

手把手教学:用PyTorch 2.5镜像5分钟搭建GPU训练环境

手把手教学&#xff1a;用PyTorch 2.5镜像5分钟搭建GPU训练环境 1. 为什么选择PyTorch 2.5镜像&#xff1f; 深度学习环境配置一直是让开发者头疼的问题&#xff0c;特别是涉及到GPU加速时。传统方式需要&#xff1a; 手动安装匹配版本的CUDA驱动处理复杂的依赖关系调试各种…...

避开这些坑!Android NFC卡模拟开发必知的5个安全陷阱

避开这些坑&#xff01;Android NFC卡模拟开发必知的5个安全陷阱 在移动支付和门禁系统日益普及的今天&#xff0c;NFC&#xff08;近场通信&#xff09;技术因其便捷性受到广泛关注。许多开发者尝试在Android设备上实现NFC卡模拟功能&#xff0c;却往往忽视了其中潜藏的安全风…...

WrenAI 新手指南:从0到1掌握文本转SQL功能

WrenAI 新手指南&#xff1a;从0到1掌握文本转SQL功能 【免费下载链接】WrenAI WrenAI makes your database RAG-ready. Implement Text-to-SQL more accurately and securely. 项目地址: https://gitcode.com/GitHub_Trending/wr/WrenAI WrenAI 是一款能够将自然语言查…...

MogFace-CVPR22模型实战:3步完成本地人脸检测+置信度标注+计数统计

MogFace-CVPR22模型实战&#xff1a;3步完成本地人脸检测置信度标注计数统计 1. 项目简介 今天给大家介绍一个特别实用的人脸检测工具——基于MogFace&#xff08;CVPR 2022&#xff09;模型开发的本地高精度人脸检测方案。这个工具最大的特点就是简单易用&#xff0c;不需要…...

PDF-Parser-1.0升级指南:如何通过API将解析能力集成到你的业务系统

PDF-Parser-1.0升级指南&#xff1a;如何通过API将解析能力集成到你的业务系统 1. 为什么需要API集成PDF解析能力 在日常业务中&#xff0c;PDF文档处理是许多企业面临的共同挑战。传统方式往往需要人工打开文件、复制粘贴内容&#xff0c;或者依赖简单的文本提取工具&#x…...

猫抓浏览器扩展:解锁网页媒体资源的终极指南

猫抓浏览器扩展&#xff1a;解锁网页媒体资源的终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今数字内容蓬勃发展的时代&#xff0c;你是否曾遇到过心仪的视频无法下载、流媒体资源难以…...

Qwen3-VL-8B-Instruct-GGUF在Matlab中的集成:科学计算增强

Qwen3-VL-8B-Instruct-GGUF在Matlab中的集成&#xff1a;科学计算增强 如果你经常用Matlab处理数据&#xff0c;肯定遇到过这样的场景&#xff1a;面对一堆实验图表&#xff0c;想快速生成分析报告&#xff1b;或者看到一张复杂的工程图纸&#xff0c;需要提取关键信息。传统做…...

告别手动整理!用OpenDataLab MinerU一键提取PDF/PPT文字图表

告别手动整理&#xff01;用OpenDataLab MinerU一键提取PDF/PPT文字图表 1. 文档处理的效率革命 每天面对堆积如山的PDF报告、PPT演示文稿和学术论文&#xff0c;你是否也经历过这样的痛苦时刻&#xff1f;为了引用一段文字&#xff0c;不得不逐字手动输入&#xff1b;想要分…...

如何突破系统壁垒?zyfun项目的全平台适配之道

如何突破系统壁垒&#xff1f;zyfun项目的全平台适配之道 【免费下载链接】zyfun 跨平台桌面端视频资源播放器,免费高颜值. 项目地址: https://gitcode.com/gh_mirrors/zy/zyfun 在数字化时代&#xff0c;用户期待在不同设备上获得一致的应用体验&#xff0c;跨平台架构…...

AudioSeal Pixel Studio应用场景:法院庭审录音嵌入法官ID+案号实现司法存证

AudioSeal Pixel Studio应用场景&#xff1a;法院庭审录音嵌入法官ID案号实现司法存证 1. 司法存证场景的痛点与需求 在司法实践中&#xff0c;庭审录音作为重要的诉讼证据&#xff0c;其真实性和完整性至关重要。传统录音存证方式面临三大核心挑战&#xff1a; 身份关联性缺…...