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

【Leetcode hot 100】35.搜索插入位置

问题链接

35.搜索插入位置

问题描述

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

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

示例 2:

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

示例 3:

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

问题解答

核心思路:二分查找的区间定义

二分查找的本质是通过不断缩小「有效查找区间」逼近目标,需在整个过程中保持区间定义不变(循环不变量)。常见两种区间:

  1. 左闭右闭区间 [left, right]:区间的左右边界均包含在查找范围内。
  2. 左闭右开区间 [left, right):区间左边界包含,右边界不包含。

1. 左闭右闭区间 [left, right]

逻辑分析

  • 初始化:left = 0(左边界),right = nums.length - 1(右边界,因包含最后一个元素)。
  • 循环条件:left <= right(当 left == right 时,区间仍有1个元素,需判断是否为目标)。
  • 指针移动:
    • nums[mid] > target:目标在左区间,缩小右边界为 right = mid - 1(mid 已排除)。
    • nums[mid] < target:目标在右区间,缩小左边界为 left = mid + 1(mid 已排除)。
    • nums[mid] == target:直接返回 mid(找到目标)。
  • 未找到目标:循环结束时 right < leftright 指向「比 target 小的最后一个元素」,插入位置为 right + 1

Java 代码

class Solution {public int searchInsert(int[] nums, int target) {int left = 0; // 左边界int right = nums.length - 1; // 右边界(左闭右闭,包含最后一个元素)// 循环条件:left <= right(区间内有元素时继续查找)while (left <= right) {// 计算 mid:避免 (left + right) 溢出(等价于 (left + right) / 2)int mid = left + (right - left) / 2;if (nums[mid] > target) {// 目标在左区间,缩小右边界(mid 已排除)right = mid - 1;} else if (nums[mid] < target) {// 目标在右区间,缩小左边界(mid 已排除)left = mid + 1;} else {// 找到目标,直接返回索引return mid;}}// 未找到目标:插入位置 = 比 target 小的最后一个元素的下一位(right + 1)return right + 1;}
}

2. 左闭右开区间 [left, right)

逻辑分析

  • 初始化:left = 0(左边界),right = nums.length(右边界,因不包含最后一个元素)。
  • 循环条件:left < right(当 left == right 时,区间为空,无需继续查找)。
  • 指针移动:
    • nums[mid] > target:目标在左区间,缩小右边界为 right = mid(右开区间,mid 不包含在新区间内)。
    • nums[mid] < target:目标在右区间,缩小左边界为 left = mid + 1(左闭区间,mid 已排除)。
    • nums[mid] == target:直接返回 mid(找到目标)。
  • 未找到目标:循环结束时 left == right,此时 left(或 right)即为插入位置。

Java 代码

class Solution {public int searchInsert(int[] nums, int target) {int left = 0; // 左边界int right = nums.length; // 右边界(左闭右开,不包含最后一个元素)// 循环条件:left < right(区间为空时停止)while (left < right) {// 计算 mid:避免溢出int mid = left + (right - left) / 2;if (nums[mid] > target) {// 目标在左区间,右边界设为 mid(右开区间,mid 不包含)right = mid;} else if (nums[mid] < target) {// 目标在右区间,左边界设为 mid + 1(mid 已排除)left = mid + 1;} else {// 找到目标,返回索引return mid;}}// 未找到目标:left == right,即为插入位置return left; // 也可返回 right(两者相等)}
}

复杂度分析

  • 时间复杂度:O(log n),二分查找每次将区间缩小一半,最多执行 log₂n 次。
  • 空间复杂度:O(1),仅用常量级变量(left、right、mid),无额外空间消耗。
http://www.dtcms.com/a/461242.html

相关文章:

  • Django ORM 字段查询表达式(Field lookup expressions)
  • 设计模式--组合模式:统一处理树形结构的优雅设计
  • 推荐算法学习笔记(十九)阿里SIM 模型
  • 高级网站开发工程师证书现代网站建设
  • 只能在线观看的电影网站咋么做wordpress教程 菜单
  • echarts画一个饼图
  • 基于改进YOLO算法的果园环境中障碍物识别与检测技术研究
  • 三元锂电池和磷酸铁锂电池:从原子晶格到应用哲学的深度解析
  • vscode-background 扩展的原理、配置和使用
  • 2100AI相亲(三)
  • 时钟服务器主地址
  • 瑞安学校网站建设口碑好网站建设价格
  • 自己做的网站访问不了建设网站哪些公司好
  • SpringMVC启动流程
  • HTTP 请求方法与参数上传形式的关系
  • 如何减少 Elasticsearch 集群中的分片数量
  • 当通过API发送请求的方式自动触发Jenkins job报错HTTP Status 403 – Forbidden的解决办法
  • 一个网站如何工作流程建立网站需要哪些手续
  • H3C网络设备 实验二:搭建两个局域网,使两个局域网相互通信(路由器,固定ip)
  • 临平房产做网站的公司wordpress屏蔽功能org
  • Skywalking 的本地开发配置
  • iOS 上架 App 全流程实战,应用打包、ipa 上传、App Store 审核与工具组合最佳实践
  • JavaScript核心构成与基础语法详解2
  • 邹平网站建设公司淘宝网站开始怎么做
  • fs 文件系统:Node.js 操作磁盘的 “万能工具”
  • Android + iOS 手机抓包 App 实操教程
  • 智慧新零售时代:施易德系统平衡技术与人力,赋能门店运营
  • 标准编码与算法
  • Python获取变量名本身​​——varname库
  • 专业站全返利网站建设