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

server/2025/3/23 8:17:15/
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 次操作)。需显式处理空数组和越界问题,仅适用于有序数组。

http://www.ppmy.cn/server/176906.html

相关文章

QT国产化系统软件开发

一、国产操作系统 1、鸿蒙HarmonyOS NEXT ‌核心架构‌ 采用自研鸿蒙内核&#xff0c;完全脱离Linux与AOSP代码&#xff0c;基于分布式架构实现跨设备资源虚拟化整合&#xff0c;支持动态调度多终端硬件能力‌。通过分布式软总线技术&#xff08;D-Bus&#xff09;实现低时延…

HarmonyOS-UIAbility 启动模式

简介 HarmonyOS涉及的启动模式&#xff0c;就是Android中的那个启动模式&#xff0c;一样的概念。它指的是一个UIAbility实例&#xff0c;被打开的时候&#xff0c;如果已经存在了UIAbility&#xff0c;是复用上一个呢&#xff0c;还是重新创建一个呢&#xff0c; 如果复用的话…

2025,游戏出海的致命伤

据最新发布的《2025年1月中国游戏产业月度报告》&#xff0c;仅今年 1 月&#xff0c;中国自研游戏海外收入就同比暴涨 28.65%&#xff0c;突破 16.75 亿美元。《原神》《鸣潮》创下的佳绩之外&#xff0c;中轻度 SLG《小舰舰超勇》空降美国下载榜&#xff0c;一举占据 TOP 10 …

17.1Go语言操作MongoDB

驱动安装 go get go.mongodb.org/mongo-driver/mongo基础连接示例 package mainimport ("context""fmt""log""time""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )func mai…

OpenCV计算摄影学(23)艺术化风格化处理函数stylization()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 风格化的目的是生成不以照片写实为目标的多种多样数字图像效果。边缘感知滤波器是风格化处理的理想选择&#xff0c;因为它们能够弱化低对比度区…

Flutter Dart 异步支持全面解析

引言 在 Flutter 开发中&#xff0c;Dart 语言提供了强大的异步支持机制。异步编程能够让程序在执行耗时操作&#xff08;如网络请求、文件读写等&#xff09;时&#xff0c;不会阻塞主线程&#xff0c;从而保证用户界面的流畅性和响应性。本文将详细介绍 Dart 中常见的异步编…

人工智能实现电脑任务自动化的开源软件

人工智能实现电脑任务自动化的开源软件 hallo大家好&#xff0c;我是星哥&#xff0c;今天给大家介绍一个开源软件&#xff0c;融合了人工智能与机器人流程自动化&#xff08;AIRPA&#xff09;的开源软件autoMate! autoMate是什么 autoMate 是一款由开源开发的本地自动化工…

从零开始写C++3D游戏引擎(开发环境VS2022+OpenGL)之十一 从打光到材质 细嚼慢咽逐条读代码系列

写在篇前的话 作为一个曾经在代码堆里面苦苦挣扎的萌新,困惑的事情在于库,各种依赖,包换文件,链接库,纠结于代码的作用意义。尤其在3D引擎开发的问题上,很多人都被各种困难给阻拦,放弃了在3D渲染,3D游戏引擎上大涨鸿图的机会。 当然关于3D游戏引擎的教程已经汗牛充栋…