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

算法21,搜索插入位置

一道经典的二分查找应用题,通常被称为“搜索插入位置”。笔记中的思路非常清晰,下面为你整理这道题的具体解法、代码实现以及需要注意的细节。

1. 题目理解

  • 题目描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

  • 核心要求:时间复杂度为 O(logN),这意味着必须使用二分查找

  • 关键结论:这道题本质上是在寻找数组中第一个大于等于目标值(>= target)的元素位置。

2. 算法思路(基于笔记)

笔记中总结了寻找“左边界”的逻辑,这正是解决此题的核心:

  1. 初始化:左指针left = 0,右指针right = nums.length - 1

  2. 循环条件while (left < right)

    • 注意:这里不能写成left <= right,因为当left == right时,我们已经找到了唯一的目标位置,应该退出循环直接返回。

  3. 中间值计算int mid = left + (right - left) / 2;(防止整数溢出)。

  4. 比较与收缩

    • 如果nums[mid] < target:说明目标值在右边,且肯定不是mid,所以left = mid + 1

    • 如果nums[mid] >= target:说明目标值在左边(或者是mid本身),我们需要继续向左寻找第一个满足条件的位置,所以right = mid

  5. 返回结果:循环结束时,leftright指向同一个位置,这个位置就是我们要找的插入点。直接返回left即可。

3. 代码实现(Java)

public int searchInsert(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 循环条件:left < right while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { // 目标在右侧,且 mid 已经排除 left = mid + 1; } else { // 目标在左侧或等于 mid,保留 mid,收缩右边界 // 这里的 else 涵盖了 nums[mid] >= target 的情况 right = mid; } } // 根据题意,数组为空时也应返回0,上述逻辑天然支持 return left; }

4. 细节辨析(为什么返回left?)

笔记右下角有一个手写的补充说明:“if (nums[left] < target) return left + 1;”。

其实,在使用while (left < right)right = mid这种模板时,循环结束后的left已经具有了“第一个大于等于 target 的位置”的性质,不需要额外的 if 判断

我们可以推演一下那个手写逻辑的场景:

  • 场景 A:如果循环结束时,nums[left] >= target

    • 说明left就是我们要插入的位置(或者是已经存在的目标)。

    • 此时直接返回left

  • 场景 B:如果循环结束时,nums[left] < target

    • 这种情况只可能发生在left指向了数组的最后一个元素之后(即left == nums.length)。

    • 为什么会这样?因为当mid计算到最后几个元素时,如果它们都小于targetleft会不断被推到mid + 1,直到越出数组边界。

    • 此时left指向的位置确实是原数组长度,也就是正确的插入位置。

    • (注:但在 Java 中,如果数组长度是 5,right最大只能是 4,所以left最大也只能是 5。当left=5时,nums[left]会越界。因此,最安全的写法就是直接return left,无需先判断。)

总结:笔记中的代码逻辑是非常标准的“寻找左边界”模板,直接返回left即可完美解决该问题。

http://www.jsqmd.com/news/797322/

相关文章:

  • Visual C++运行库一键修复指南:解决Windows程序启动问题的完整方案
  • 系统突然出现 CPU 飙高,你如何排查?
  • 告别OrthoFinder限制:用IQtree+Notung搞定跨物种基因家族树(附兰科NB-ARC实战)
  • 蓝叠模拟器抓包难题?用Proxifier+ Fiddler搞定HTTPS请求(保姆级图文教程)
  • WarcraftHelper魔兽争霸3终极优化指南:告别卡顿与兼容性问题
  • Bebas Neue字体技术深度解析:开源无衬线显示字体的现代排版解决方案
  • AI教材生成秘籍!低查重AI写教材工具,快速产出30万字优质教材!
  • 基于深度学习的遥感船舶SAR图像识别 YOLOv11在遥感图像船舶识别中的应用
  • 从ITF到DSPF:华大九天Empyrean RCExplorer在版图寄生分析中的实战解析
  • 企业数智化
  • OpenClaw 汉化版 Windows 一键安装指南|零基础 5 分钟部署 告别命令行
  • 云计算Linux——Nginx源码编译安装(十一)
  • TVA与传统视觉技术的本质区别——以机器人灵巧操控为例(10)
  • HFSS主从边界条件实战:用周期性边界快速搞定4x4微带天线阵仿真(附30GHz模型)
  • 别再只用默认样式了!LVGL Chart图表控件的10个美化技巧与高级样式配置
  • ZonyLrcToolsX:跨平台歌词下载解决方案与技术爱好者的音乐管理利器
  • Kotlin ViewModel
  • 智能体与世界模型“同源同宗”:当智能体足够强,世界模型就出来了
  • Vivado 2023.1 与 Questasim 2024.1 协同仿真环境搭建全攻略
  • League-Toolkit:基于LCU API的英雄联盟客户端自动化工具深度解析
  • 2025届毕业生推荐的十大AI辅助论文助手实际效果
  • D3KeyHelper暗黑3鼠标宏工具:从零开始掌握自动化战斗的终极指南
  • 必知必会:大模型位置编码RoPE与ALiBi位置编码详解
  • Android 11(R) MTK平台新分区实战:从分区表到SELinux的完整配置
  • 2025届必备的五大降AI率平台实测分析
  • 3大核心技术解密:LeagueAkari本地自动化工具架构设计与实战指南
  • sndcpy音频转发工具:Android设备音频镜像的完整指南
  • 终极风扇控制神器:FanControl 让你的电脑静音又凉爽
  • Obsidian官方同步插件 Nutstore Sync:冲突与增量同步指南
  • 【RHCA+】安装RHEL7操作系统