从零开始刷算法-二分-搜索插入位置

在刷算法题时,很多人对二分查找(Binary Search)不陌生,但实际在面试或者实战中,如何利用二分查找解决插入位置问题 ,却常常容易犯错。今天我们主要巩固昨天的内容,来看一个简单题 LeetCode 第 35 题 "搜索插入位置(Search Insert Position)",并用 C++ 代码实现。

题目描述

给定一个升序排列 的整数数组 nums 和一个目标值 target,请你在数组中找到目标值的索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

示例:

cs 复制代码
输入: nums = [1,3,5,6], target = 5
输出: 2

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

输入: nums = [1,3,5,6], target = 7
输出: 4

要求时间复杂度 O(log n) ,也就是自然想到使用二分查找

思路分析

这道题其实就是寻找大于等于目标值的第一个元素的位置 ,也可以理解为lower bound(二分查找模板)

具体思路:

  1. 定义两个指针 leftright 分别指向数组两端。

  2. 使用二分法循环:

    • 计算中点 mid = (left + right) / 2

    • 如果 nums[mid] < target,说明目标值在右侧,left = mid + 1

    • 否则说明目标值在左侧(包括 mid 本身),right = mid - 1

  3. 循环结束后,left 指向的就是目标值的插入位置。

小技巧:这里我们用的是闭区间 left, right 二分查找。


C++ 代码实现

cpp 复制代码
#include <vector>
using namespace std;

class Solution {
    // lower_bound:寻找大于等于 target 的第一个位置
    int lower_bound(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] < target) {
                left = mid + 1; // target 在右侧
            } else {
                right = mid - 1; // target 在左侧或就是 mid
            }
        }
        return left; // 循环结束后,left 就是插入位置
    }

public:
    int searchInsert(vector<int>& nums, int target) {
        return lower_bound(nums, target);
    }
};

核心技巧总结

  1. 闭区间 vs 开区间

    • 本题采用 [left, right] 闭区间模板。

    • left 最终就是插入位置。

  2. lower_bound 思想

    • 在排序数组中找到第一个不小于 target 的位置。

    • 这也是 STL 中 std::lower_bound 的原理。

  3. 时间复杂度

    • 二分查找的时间复杂度为 O(log n),符合题目要求。

扩展

  • 1.如果题目要求找到最后一个小于等于 target 的位置 ,可以改成 upper bound 模板:

    cpp 复制代码
    if (nums[mid] <= target)
        left = mid + 1;  // 前面染成红色
    else
        right = mid - 1;
    
    // 这里对应最后就是返回left - 1了也就是最后一块红色

总结

  • 这道题本质是查找插入位置 ,可以抽象为 lower bound

  • 核心是熟练掌握二分查找模板。

  • 结合面试角度:二分查找不仅仅用于查找元素,也可以用来求最优解、最小值或最大值等问题。

相关推荐
明月_清风1 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣1 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
hetao17338371 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J2 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康2 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a187927218312 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN4 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆5 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
阳明山水5 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技6 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算