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

【每日算法】搜索插入位置 LeetCode

这段代码实现了一个高效的二分查找算法,用于在有序数组中查找目标值的插入位置。

    public int SearchInsert(int[] nums, int target){if (nums == null || nums.Length == 0)return 0;int left = 0;int right = nums.Length - 1;while (left <= right){//避免整数溢出int mid = left + (right - left) / 2;if (nums[mid] == target){return mid;}else if (nums[mid] < target){left = mid + 1;}else{right = mid - 1;}}return left;}

以下是逐步解析:

1. 方法功能

  • 输入:一个升序排列的整数数组 nums 和目标值 target 。
  • 输出
    • 如果 target 存在于数组中,返回其索引。
    • 如果 target 不存在,返回它应该插入的位置(保持数组有序)。

2. 代码逐行解析

(1) 边界检查
if (nums == null || nums.Length == 0)return 0;
  • 作用:处理空数组或 null 输入。
  • 逻辑:如果数组为空, target 应插入到索引 0 的位置。
(2) 初始化指针
int left = 0;
int right = nums.Length - 1;
  • 作用:初始化二分查找的左右边界。
  • left :搜索区间的起始索引(初始为 0 )。
  • right :搜索区间的结束索引(初始为数组最后一个元素的索引)。
(3) 二分查找循环
while (left <= right)
  • 条件:当 left <= right 时继续搜索,确保搜索区间有效。
(4) 计算中间索引
int mid = left + (right - left) / 2;
  • 作用:计算当前搜索区间的中间索引。
  • 优化:使用 left + (right - left) / 2 而非 (left + right) / 2 ,避免整数溢出。
(5) 比较中间值与目标值

Csharp

if (nums[mid] == target)
{return mid;
}
  • 逻辑:如果中间值等于 target ,直接返回其索引。
(6) 调整搜索区间
else if (nums[mid] < target)
{left = mid + 1;
}
else
{right = mid - 1;
}
  • 逻辑
    • 如果中间值小于 target ,说明 target 在右半区间,将 left 移动到 mid + 1 。
    • 如果中间值大于 target ,说明 target 在左半区间,将 right 移动到 mid - 1 。
(7) 返回插入位置
return left;
  • 作用:如果未找到 target , left 指向第一个大于 target 的元素位置,即插入位置。

3. 关键点分析

(1) 为什么返回 left ?
  • 二分查找结束时, left 和 right 的关系为 left = right + 1 。
  • left 的位置是 target 应该插入的位置(保持数组有序)。
(2) 时间复杂度
  • O(log n):每次迭代将搜索区间减半。
(3) 空间复杂度
  • O(1):仅使用常数级别的额外空间。

4. 示例验证

示例 1:目标值存在
int[] nums = {1, 3, 5, 7};
int target = 5;
// 输出:2(5的索引为2)
示例 2:目标值不存在
int[] nums = {1, 3, 5, 7};
int target = 4;
// 输出:2(4应插入到索引2的位置)
示例 3:目标值大于所有元素
int[] nums = {1, 3, 5, 7};
int target = 8;
// 输出:4(8应插入到末尾)
示例 4:空数组
int[] nums = {};
int target = 1;
// 输出:0

5. 总结

  • 高效性:利用二分查找快速定位目标值或插入位置。
  • 鲁棒性:显式处理空数组和整数溢出问题。
  • 通用性:适用于所有升序排列的数组场景。
http://www.dtcms.com/a/390107.html

相关文章:

  • vue+springboot+ngnix前后端分离项目部署
  • sward入门到实战(1) - 安装教程
  • 独立站的优势有哪些
  • Java学习历程18——哈希表的使用
  • 机械传动里的名词——传动比
  • qiankun 主子应用部署教程(Nginx 小白版)
  • 开启视觉奇旅:走进《计算机图形学》的世界
  • 光伏组件IV曲线测试仪的功能
  • MySQL MHA
  • 【试题】信息安全管理员考试题库
  • 硬件(十四)SPI通信协议
  • 大模型学习:使用FastText工具进行文本分类
  • pip 指令大全
  • 计算机基础·MySQL
  • 22-29、深度学习知识手册:从全连接到生成模型的融会贯通指南
  • 【FastCAEFlow案例分享】软件在汽车场景中的应用
  • Python二进制数据读取与可变缓冲区操作详解:从基础到高阶应用
  • 面向对象编程(OOP):Java 的核心思想(详细笔记)
  • I2C 通信、AT24C02 EEPROM及LM75温度传感器的配置
  • Halcon中的并行编程(二)
  • Gin框架参数绑定完全指南:从基础到实战最佳实践
  • TF 坐标旋转的方向如何确定
  • C++基础(16)——用红黑树封装出map和set
  • 前端编程工具有哪些?常用前端编程工具推荐、前端编程工具对比与最佳实践分享
  • 换网络这事, Comcast 销户了
  • Day26_【深度学习(6)—神经网络NN(1.2)前向传播的搭建案例】
  • 河南省 ERA5 气象数据处理教程(2020–2025 每月均值)
  • IIS短文件漏洞修复全攻略
  • jdk-7u25-linux-x64.tar.gz 安装教程(Linux下JDK 7 64位解压配置详细步骤附安装包)
  • 边界值分析法的测试用例数量:一般边界值分析(4n+1)和健壮性测试(6n+1)计算依据