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

3.3 二分查找专题: LeetCode 35. 搜索插入位置

1. 题目链接

LeetCode 35. 搜索插入位置


2. 题目描述

给定一个升序排列的整数数组 nums 和一个目标值 target,要求:

  • target 存在于数组中,返回其索引。
  • 若不存在,返回其应插入的位置,使得插入后数组仍保持有序。

示例

  • 输入:nums = [1,3,5,6], target = 5 → 输出:2
  • 输入:nums = [1,3,5,6], target = 2 → 输出:1

3. 示例分析
  1. 目标存在
    • nums = [1,3,5,6], target = 5,直接返回索引 2
  2. 目标不存在
    • nums = [1,3,5,6], target = 2,插入到索引 1,数组变为 [1,2,3,5,6]

4. 算法思路

二分查找法

  1. 初始化指针left = 0, right = nums.size() - 1
  2. 循环缩小范围
    • 计算中间索引 mid = left + (right - left) / 2(防止整数溢出)。
    • nums[mid] < target,目标在右半区间,调整 left = mid + 1
    • nums[mid] ≥ target,目标在左半区间或等于当前值,调整 right = mid
  3. 终止条件:当 left == right 时,检查 nums[left]target 的关系:
    • nums[left] < target,返回 left + 1
    • 否则,返回 left

5. 边界条件与注意事项
  1. 空数组处理:用户代码未显式处理空数组,若 nums 为空,访问 nums[left] 会导致越界错误。需增加:
    if (nums.empty()) return 0;
    
  2. 目标值大于所有元素:循环结束后 left 指向末尾,nums[left] < target 时返回 left + 1,正确。
  3. 重复元素:返回第一个匹配或插入位置(符合题意)。

6. 代码实现
class Solution 
{
public:
    int searchInsert(vector<int>& nums, int target) 
    {
        if (nums.empty()) return 0;
        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;
          
        }
        if(nums[left] < target) return left + 1; 
        return left;
    }
};

在这里插入图片描述


暴力枚举法与二分查找法对比图表

对比维度暴力枚举法二分查找法
核心思想遍历数组,找到第一个大于等于 target 的位置。利用有序性,每次将搜索范围缩小一半,定位插入位置。
时间复杂度O(n)(遍历所有元素)。O(log n)(每次缩小一半范围)。
空间复杂度O(1)(无需额外存储)。O(1)(仅需常数变量记录指针)。
实现方式单层循环逐个比较元素。循环调整左右指针,计算中间索引。
适用场景无序数组、极小数据规模(n ≤ 100)。有序数组、大规模数据(n ≥ 1e6)。
优点实现简单,不依赖数组有序性。时间复杂度极低,适合处理大规模数据。
缺点数据规模大时性能极差(例如 n=1e6 时需 1e6 次操作)。需显式处理空数组和越界问题,仅适用于有序数组。

相关文章:

  • 事务隔离级别是?
  • 04 泛型编程
  • AMBA-CHI协议详解(二十四)
  • window.btoa 和 atob 记不住,怎么根据字母意思去理解
  • 错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
  • 当底层硬盘老旧时,如何限制Linux服务器和Windows服务的IOPS?
  • 苍穹外卖-Spring Task使用的前置条件
  • GROOT N1,英伟达开源的人形机器人模型
  • 【LLMs篇】06:Encoder-Only vs Decoder-Only vs Encoder-Decoder
  • OWASP Top 10 解读:如何构建更安全的应用?
  • 【C++】二叉树和堆的链式结构
  • 阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024
  • MySQL 调优
  • 线性规划的标准形式
  • openpnp - 如果安装面的钣金接触面不平,可以尝试加垫片
  • Springboot List集合的校验方式
  • 替代Qt中信号与槽的完整例子。
  • CVPR2025 | TAPT:用于视觉语言模型鲁棒推理的测试时对抗提示调整
  • 如何实现一个DNS
  • Java Web应用程序实现用户登录、学生信息管理和验证码验证以及页面跳转等基本功能(IDEA)含(Ajax、JSTL)
  • 武汉大学新闻与传播学院已由“80后”副院长吴世文主持工作
  • 五一去哪玩?“时代交响”音乐会解锁艺术假期
  • 司法服务保障西部陆海新通道建设,最高法专门发文
  • 坚持科技创新引领,赢得未来发展新优势
  • 媒体:黑话烂梗包围小学生,“有话好好说”很难吗?
  • 病人有头发,照护者不发疯:《黑镜》中的身体缺席与虚伪关怀