【题目链接】
35. 搜索插入位置
【题目描述】
在这里插入图片描述
【题解】
通过题目可以知道这是一道经典的二分查找的题目,对于二分查找的题目,根据需要查找的两个边界点,分为两个不同的模板,如下图所示。
在这里插入图片描述
这道题要求在数组中查找目标值并返回其索引,若目标值不存在,则返回它按顺序插入的位置。因此,它适合使用绿色边界点对应的二分查找模板。
该模板适用于查找最小满足条件的值的场景,常用于定位满足特定条件的最小值或区间的左边界。其核心逻辑是通过不断收缩右边界,最终定位到符合条件的最小值。

其模板如下:

bool check(int x) {/* ... */} // 检查x是否满足某种性质int bsearch_2(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}return l;
}

【AC代码】

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int l = 0, r = nums.size();while(l < r) {int mid = l + r >> 1;if(nums[mid] >= target)r = mid;elsel = mid + 1;}return l;}
};

【思考】
1.能否使用红色边界点对应的模板呢?
这道题同样可以用红色边界点对应的模板来解答,只是需要先将问题转化为寻找最后一个小于目标值的元素位置,再通过推导得出插入位置。
该模板的核心是定位最后一个满足条件的位置(即右边界),而原问题实际需要的是第一个大于等于目标值的位置(即左边界)。两者的转化逻辑很明确:插入位置 = 最后一个小于目标值的位置 + 1,而寻找最后一个小于目标值的位置恰好是红色边界点模板的典型应用场景。

其模板如下:

bool check(int x) {/* ... */} // 检查x是否满足某种性质int bsearch_1(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}

【AC代码】

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1; while (l < r) {int mid = (l + r + 1) / 2; if (nums[mid] < target) { l = mid;} else {                  r = mid - 1;}}// 循环结束后,l是最后一个可能<target的位置,需判断是否真的满足if (nums[l] < target) {return l + 1; // 存在<target的元素,插入位置为l+1} else {return l;     // 所有元素≥target,插入位置为l(即第一个≥target的位置)}}
};

2.模板的两个边界lr如何确定?
在ac之前,我卡在了一个地方,r一直取的值是r = nums.size() - 1,这导致在测试样例时,示例1和示例2都可以通过,但输入3确报了错。通过调试输出排查后发现,问题的根源在于边界值的设置。
r = nums.size() - 1时,示例1:
l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;
l=2,r=3,mid=2,nums[mid]=5,5≥5,r=2;l=2,r=3,mid=2,nums[mid]=5,5≥5,r=2;l=2,r=3,mid=2,nums[mid]=5,55,r=2;
l=2,r=2,l=2,r=2,l=2,r=2,退出循环,返回l=2,答案正确
r = nums.size() - 1时,示例2:
l=0,r=3,mid=1,nums[mid]=3,3>target,r=1;l=0,r=3,mid=1,nums[mid]=3,3>target,r=1;l=0,r=3,mid=1,nums[mid]=3,3target,r=1;
l=0,r=1,mid=0,nums[mid]=1,1<target,l=mid+1=0+1=1;l=0,r=1,mid=0,nums[mid]=1,1<target,l=mid+1=0+1=1;l=0,r=1,mid=0,nums[mid]=1,1target,l=mid+1=0+1=1;
l=1,r=1,l=1,r=1,l=1,r=1,退出循环,返回l=1,答案正确
r = nums.size() - 1时,示例3:
l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3target,l=mid+1=1+1=2;
l=2,r=3,mid=2,nums[mid]=5,5<target,l=mid+1=2+1=3;l=2,r=3,mid=2,nums[mid]=5,5<target,l=mid+1=2+1=3;l=2,r=3,mid=2,nums[mid]=5,5target,l=mid+1=2+1=3;
l=3,r=3,l=3,r=3,l=3,r=3,退出循环,返回l=3,答案错误
通过上述分析可以发现,r = nums.size()的设置确保了搜索区间覆盖所有可能的插入位置,而r = nums.size() - 1会漏掉插入到数组末尾的情况,导致部分测试用例失败。
二分查找的核心是明确搜索区间的定义,并确保区间覆盖所有可能的解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93365.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93365.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93365.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568 NPU RKNN(五):RKNN-ToolKit-lite2板端推理

文章目录1、前言2、目标3、安装RKNN-ToolKit-lite23.1、安装环境3.2、安装RKNN-ToolKit-lite23.3、验证4、完整的测试程序5、运行测试程序6、程序拆解7、总结1、前言 本文仅记录本人学习过程&#xff0c;不具备教学指导意义。 2、目标 之前提到过&#xff0c;RKNN-Toolkit2-…

二分查找。。

1 二分查找二分查找前提是数组有序。先令&#xff0c;left 0 , right 7mid (right left) / 2;如果mid的值大于要查找的值&#xff0c;则right mid - 1&#xff1b;如果小于&#xff0c;left mid 1&#xff1b;如果mid的值等于要查找的值&#xff0c;查找成功。重复步骤2…

Spring Ai 如何配置以及如何搭建

Spring Ai 如何配置以及如何搭建 解释什么是Spring ai 首先&#xff0c;我们用Spring ai 其实不是去了解他的LLM,以及底层用的一些东西&#xff0c;Spring AI,提供给我们的其实是对各种大模型快速调用&#xff0c;提供了大模型API的作用&#xff0c;Spring AI 的核心定位是提…

FCC认证三星XR头显加速全球量产,微美全息AI+AR技术引领智能眼镜硬件创新

据悉&#xff0c;三星(SSNGY.US)XR头显Project Moohan目前已获得美国FCC认证&#xff0c;FCC认证表明该款头显即将上市&#xff0c;之前三星财报会议也表明确认将于今年年底推出XR头显。此前有报道称&#xff0c;该设备将采用索尼旗舰级 OLEDoS 显示屏&#xff0c;像素密度高达…

洛谷P1595讲解(加强版)+错排讲解

前言接我原先的文章&#xff0c;因为一场考试&#xff0c;让我对这道题记忆深刻注&#xff1a;&#xff08;因为那道题&#xff0c;所以80分&#xff09;正文1.分析题目题目&#xff1a;某人写了 n 封信和 n 个信封&#xff0c;如果所有的信都装错了信封。求所有信都装错信封共…

提升化工制造质量的 7 种方法

尽管化工制造属于制造业的一个子类别&#xff0c;但它是一个广泛的范畴&#xff0c;涵盖了基础化学品、树脂和合成纤维、农药和化肥、涂料和粘合剂&#xff0c;甚至消费类化合物&#xff08;如肥皂和清洁化学品&#xff09;等所有领域。尽管这些细分领域差异巨大&#xff0c;但…

从“数据垄断”到“全民共建”:Dataparts如何重构智能时代的数据流通规则?

从“数据垄断”到“全民共建”&#xff1a;Dataparts如何重构智能时代的数据流通规则&#xff1f;在杭州某科技园区的会议室里&#xff0c;一场关于“AI大模型训练数据”的讨论正在激烈进行。某头部AI企业的技术总监指着屏幕上的“对话场景零件库”说&#xff1a;“过去我们花3…

31 HTB Union 机器 - 中等难度

第一阶段 侦查nmap扫描oxdfparrot$ nmap -p- --min-rate 10000 -oA scans/nmap-alltcp 10.10.11.128 Starting Nmap 7.80 ( https://nmap.org ) at 2021-11-19 08:29 EST Nmap scan report for 10.10.11.128 Host is up (0.092s latency). Not shown: 65534 filtered ports POR…

【数据分享】上市公司创新韧性数据(2007-2023)

数据介绍核心看点&#xff1a; 在复杂多变的市场环境中&#xff0c;企业如何通过创新维持竞争力&#xff1f;创新韧性是衡量企业在外部冲击下保持创新活力的关键指标。本文分享2007-2023年上市公司创新韧性数据&#xff0c;为研究企业抗风险能力提供核心支持。数据概览数据名称…

服务器配置开机自启动服务

一、配置启动文件sudo vim /etc/systemd/system/smartailab-backend.service sudo vim /etc/systemd/system/reall3d-frontend.servicesudo vim /etc/systemd/system/Culture_Liquor-backend.servicevim /etc/systemd/system/Culture_Liquor-backend.service内容&#xff1a;[U…

Ubuntu 25.04更新了哪些内容揭秘

2025年4月,Canonical正式推出Ubuntu 25.04 版本,代号"Plucky Puffin(勇敢的海鹦)"。此次发布围绕AI算力强化、桌面交互革新与跨架构支持三大核心方向展开,为开发者、创作者及企业用户带来多项突破性升级。 一、核心系统更新 systemd v257.4带来了重要的上游更新…

PHP反序列化的CTF题目环境和做题复现第2集_POP链构造

1 通过pop参数get方式提交反序列信息 2 题目 http://192.168.1.8/fxl2/fxl2_pop.php <?php highlight_file(__FILE__);class a {protected $var;public function hello(){echo $this->var;} }class b {public $cla;public function __destruct(){$this->cla->…

攻防世界—fakebook(两种方法)

一.审题这边先进行测试&#xff0c;login和join都失败了&#xff0c;所以没获取到什么消息。二.dirsearch工具扫描所以拿dirsearch扫一下&#xff0c;看看有没有什么文件可以访问。python3 dirsearch.py -u url可以看到当前目录下存在flag.php,robots.txt等&#xff0c;访问fla…

AI+物联网如何重塑仓储供应链?3个落地场景与系统架构设计思路

一、引言 在科技飞速发展的当下&#xff0c;AI与物联网技术的融合为仓储供应链领域带来了革新契机。这种融合不仅优化了传统运作模式&#xff0c;还催生出更智能、高效的管理方案&#xff0c;业财一体管理软件也在其中发挥着关键作用。 二、AI物联网在仓储供应链的落地场景 &am…

C++ 内存管理(内存分布 , 管理方式 , new和delete实现原理)

目录 1. C/C内存分布 练习: 2. C语言动态内存管理方式 2.1 malloc/calloc/realloc的区别 2.2 malloc的实现原理 2.3 内存块分布与扩容 3. C动态内存管理方式 3.1 new/delete操作类内置类型 1. new操作内置类型 2. delete操作内置类型 3.2 new/delete操作类自定义类型…

1.2. qemu命令起虚拟机增加网络配置

1. 网络配置 常见的网络模式分为tap网络和基础网络模式两种。 1.1. TAP网络&#xff08;桥接模式&#xff09; 虚拟机直接接入宿主机物理网络&#xff0c;获得独立IP 1.1.1. 使用tap方式起虚拟机网络-netdev tap,idhostnet0,ifnametap0 \-device virtio-net-pci,netdevhostnet0…

分享一个Oracle表空间自动扩容与清理脚本

一、基础环境准备&#xff08;首次执行&#xff09; -- 1. 创建表空间监控表&#xff08;存储使用率、容量等信息&#xff09; create table monitor_tablespace_rate (tbs_name varchar2(50), -- 表空间名total_gb number, -- 总容量(GB)used_gb number, …

Flink Sql 按分钟或日期统计数据量

一、环境版本 环境版本Flink1.17.0Kafka2.12MySQL5.7.33 【注意】Flink 1.13版本增加Cumulate Window&#xff0c;之前版本Flink Sql 没有 Trigger 功能&#xff0c;长时间的窗口不能在中途触发计算&#xff0c;输出中间结果。比如每 10S 更新一次截止到当前的pv、uv。只能用T…

LeetCode 2460.对数组执行操作

给你一个下标从 0 开始的数组 nums &#xff0c;数组大小为 n &#xff0c;且由 非负 整数组成。 你需要对数组执行 n - 1 步操作&#xff0c;其中第 i 步操作&#xff08;从 0 开始计数&#xff09;要求对 nums 中第 i 个元素执行下述指令&#xff1a; 如果 nums[i] nums[i …

深入解析 @nestjs/typeorm的 forRoot 与 forFeature

nestjs/typeorm 是 NestJS 与 TypeORM 集成的官方模块&#xff0c;提供了 forRoot() 和 forFeature() 两个核心静态方法用于配置数据库连接和实体注册。本文将深入解析这两个方法的机制、使用场景和最佳实践。 一、TypeOrmModule.forRoot() - 全局数据库配置 forRoot() 方法用于…