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

二分查找 | 二分模板 | 二分题目解析

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.二分查找 二分查找的一个前提就是要保证数组是有序的&#xff08;不准确&#xff09;&#xff01;利用二段性&#xff01; 1.朴素二分模板 朴素二分法的查找中间的值和目标值比较 while(left < right) // 注意是要&#xff1a; < {int mid left (right -left) / 2;…...

uni-app应用更新(Android端)

关于app更新&#xff0c;uni-app官方推荐的是 uni-upgrade-center&#xff0c;看了下比较繁琐&#xff0c;因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端&#xff0c…...

JavaEE(2):前后端项目之间的交互

现在&#xff0c;在网页中通过超链接&#xff0c;表单就可以向后端发送请求&#xff0c;后端也可以正常响应内容。 以前通过表单访问后端的请求方式称为同步请求 同步请求 当网页与后端交互时&#xff0c;前端不能再进行其他操作 服务器端响应回来的内容&#xff0c;会把整个浏…...

(已开源-CVPR 2024)YOLO-World: Real-Time Open-Vocabulary Object Detection

169期《YOLO-World Real-Time Open-Vocabulary Object Detection》 You Only Look Once (YOLO) 系列检测模型是目前最常用的检测模型之一。然而&#xff0c;它们通常是在预先定义好的目标类别上进行训练&#xff0c;很大程度上限制了它们在开放场景中的可用性。为了解决这一限制…...

Spring6梳理4——SpringIoC容器

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;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风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…...

Monkey日志ANR、CRASH、空指针异常及其他异常数据分析

引言 在Android开发过程中&#xff0c;monkey测试是一种常用的随机测试手段&#xff0c;用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息&#xff0c;包括应用程序崩溃&#xff08;Crash&#xff09;、无响应&#xff08;ANR&…...

Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区

在Vue 3结合Element Plus中&#xff0c;实现一个级联选择器&#xff08;Cascader&#xff09;来展示省市区&#xff08;甚至到更细分的级别&#xff0c;如街道、小区等&#xff09;的联动选择是一个常见的需求。Element Plus的Cascader组件非常适合这样的场景&#xff0c;因为它…...

使用卫星仿真软件STK的一些应用和思考(星地链路、星间链路)

目录 任务描述利用STK建模星地协同系统3个GEO高轨卫星240/20/1 Walker-Star Constellation 低轨卫星星座地面站或者地面设备 链路建模与数据提取处理星地链路星间链路数据读取的几种方法最麻烦的方法使用Matlab与STK互联接口使用大规模使用Chain 总结 任务描述 在一个星地协同…...

pytorch对不同的可调参数,分配不同的学习率

在 PyTorch 中&#xff0c;你可以通过为优化器传递不同的学习率来针对不同的可调参数分配不同的学习率。这通常通过向优化器传递一个字典列表来实现&#xff0c;其中每个字典指定特定参数组的学习率。下面是一个示例代码&#xff0c;展示了如何实现这一点&#xff1a; import …...

零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍

1. time模块 time()&#xff1a;获取当前时间戳&#xff0c;是一个数字 localtime()&#xff1a;返回一个time.struct_time对象&#xff0c;里面有年月日时分秒&#xff0c;还有星期几&#xff08;0表示星期一&#xff09;和今年的第几天 import timeprint(time.time()) pri…...

快速回顾-HTML5

HTML5-常用的标签&#xff1a;https://blog.csdn.net/TKOP_/article/details/111395865 <!-- HTML5:声明文档类型的标签 --> <!DOCTYPE html><!-- 用于声明网页的主要语言为简体中文 --> <!-- 帮助搜索引擎、浏览器等理解网页的语言内容&#xff0c;以便…...

视频技术未来展望:EasyCVR如何引领汇聚融合平台新趋势

随着科技的飞速发展&#xff0c;视频技术已成为现代社会不可或缺的一部分&#xff0c;广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。本文将探讨视频技术的未来发展趋势&#xff0c;并深入分析TSINGSEE青犀EasyCVR视频汇聚融合平台的技术优势&#xff0c;展现其…...

7个流行的开源数据治理工具

数字化时代&#xff0c;数据是已经成为最宝贵的资产之一。数据支撑着我们的政府、企业以及各类组织的所有流程&#xff0c;并为决策以及智能化服务提供支撑。大数据有大用途&#xff0c;但是也可能隐藏着巨大的风险&#xff0c;特别是如果我们对数据的情况不是很了解的时候&…...

js | XMLHttpRequest

是什么&#xff1f; 和serve交互数据的对象&#xff1b;能够达到页面部分刷新的效果&#xff0c;也就是获取数据之后&#xff0c;不会使得整个页面都刷新&#xff1b;虽然名字是XML&#xff0c;但不限于XML数据。 怎么用&#xff1f; function reqListener() {console.log(thi…...

2024国赛数学建模A题思路模型代码

2024国赛数学建模思路资料&#xff0c;思路获取见文末名片 数学建模感想 纪念逝去的大学数学建模&#xff1a;两次校赛&#xff0c;两次国赛&#xff0c;两次美赛&#xff0c;一次电工杯。从大一下学期组队到现在&#xff0c;大三下学期&#xff0c;时间飞逝&#xff0c;我的…...

使用SVD(奇异值分解)进行降维的奇妙之旅

在数据分析和机器学习的广阔天地中&#xff0c;降维技术占据着举足轻重的地位。当我们面对高维数据时&#xff0c;不仅计算成本高昂&#xff0c;而且容易遭遇“维度灾难”&#xff0c;即随着维度的增加&#xff0c;数据的稀疏性和距离度量失效等问题愈发严重。为了克服这些挑战…...

【C++ 第二十一章】特殊类的设计(学习思路)

1.请设计一个类&#xff0c;不能被拷贝 设计思路 拷贝只会使用在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 的做法 将拷贝构造函数与赋值运算符…...

Java设计模式【命令模式】-行为型

1. 介绍 命令模式&#xff08;Command Pattern&#xff09; 是一种行为型设计模式&#xff0c;它将一个请求封装为一个对象&#xff0c;从而使我们可以用不同的请求对客户端进行参数化&#xff0c;并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与…...

【HarmonyOS】一键扫码功能

【HarmonyOS】一键扫码功能 前言 鸿蒙在api10之后&#xff0c;对系统api的基础上&#xff0c;封装了较为复杂功能的开发工具包&#xff0c;统一称之为Kit。这些Kit根据功能定义的不同&#xff0c;划分为不同的种类Kit。如下图所示&#xff1a; 其实可以理解为集成在系统中的…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...