Problem: 35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(log N)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决一个经典的搜索问题:搜索插入位置 (Search Insert Position)。问题要求在一个已排序的数组 nums 中查找目标值 target。如果找到,则返回其索引;如果未找到,则返回它应该被插入的位置的索引,以保持数组的有序性。

该算法采用的核心方法是二分查找(Binary Search),这是一种在有序数据集中进行高效查找的算法。此特定实现方式是一种常见的“左闭右开”区间模板,其目标是找到第一个大于或等于 target 的元素的位置。

算法的整体思路可以分解为以下步骤:

  1. 定义搜索区间

    • 算法使用两个指针 leftright 来定义一个左闭右开的搜索区间 [left, right)
    • left 初始化为 0,right 初始化为数组的长度 nums.length。这意味着初始搜索范围覆盖了整个数组的所有合法索引以及末尾的插入位置。
  2. 循环搜索

    • 算法的主体是一个 while (left < right) 循环。这个条件意味着只要搜索区间 [left, right) 还不是空的(即至少包含一个元素),搜索就继续。当 left == right 时,区间为空,循环终止。
    • 在循环内部,计算中间位置 mid
    • 比较与分区:将中间位置的元素 nums[mid]target进行比较,以缩小搜索范围:
      • Case 1: nums[mid] < target: 如果中间值小于目标值,说明 target 必定在 mid 的右侧。因此,我们可以安全地排除掉 mid 及其左侧的所有元素。通过 left = mid + 1,将搜索区间更新为 [mid + 1, right)
      • Case 2: nums[mid] >= target: 如果中间值大于或等于目标值,说明 target 可能就是 nums[mid],或者在 mid 的左侧。在这种情况下,mid 本身就是一个潜在的答案(可能是第一个大于等于target的位置)。我们不能排除 mid,因此通过 right = mid,将搜索区间更新为 [left, mid)
  3. 确定最终结果

    • 循环最终会因为 leftright 相遇而终止。此时,left (或 right) 指向的位置就是“插入点”。
    • 这个位置的含义是:它是数组中第一个大于或等于 target 的元素的索引。
    • 如果 target 存在于数组中,这个位置就是 target 首次出现的索引。
    • 如果 target 不存在,这个位置就是 target 应该被插入以保持数组有序的索引。
    • 因此,直接返回 left 即可。

完整代码

class Solution {/*** 在一个已排序的数组中查找目标值,如果找到则返回其索引,* 否则返回它应该被插入的位置的索引。* @param nums 一个已升序排序的整数数组* @param target 目标整数* @return 目标值的索引或插入位置的索引*/public int searchInsert(int[] nums, int target) {// left: 搜索区间的左边界,初始为 0。int left = 0;// right: 搜索区间的右边界,初始为数组长度。// 定义了一个左闭右开的搜索区间 [left, right)。int right = nums.length;// 当左边界小于右边界时,搜索空间不为空,循环继续。// 循环终止条件是 left == right。while (left < right) {// 计算中间索引。>> 1 是除以2的位运算,效率高且能防止(left+right)整数溢出。int mid = (left + right) >> 1;// 如果中间值小于目标值if (nums[mid] < target) {// 说明目标值必定在右半部分 [mid + 1, right) 中。// 更新左边界,排除 mid 及左边的所有元素。left = mid + 1;} else {// 如果中间值大于或等于目标值// 说明目标值在左半部分 [left, mid] 中,或者 mid 本身就是目标。// 更新右边界,将 mid 包含在新的搜索区间 [left, mid) 内作为可能的答案。right = mid;}}// 循环结束时,left 和 right 相遇。// 该位置就是插入点,它指向数组中第一个大于或等于 target 的元素。// 这既是 target 的插入位置,也是当 target 存在时其首次出现的索引。return left;}
}

时空复杂度

时间复杂度:O(log N)

  1. 算法核心:该算法是二分查找。
  2. 计算依据
    • while 循环的每一次迭代中,搜索区间 [left, right) 的大小(即 right - left)都会被大约减半。
    • 假设初始的搜索区间大小为 N。经过 k 次迭代后,区间大小变为 N / 2^k
    • 循环在区间大小缩减到 1 或 0 时终止,即 N / 2^k ≈ 1
    • 解这个方程得到 2^k ≈ N,所以 k ≈ log₂(N)
    • 由于循环的迭代次数与 N 的对数成正比,因此时间复杂度为 O(log N)

空间复杂度:O(1)

  1. 主要存储开销:算法在执行过程中,只使用了少数几个整型变量来存储状态,如 left, right, mid
  2. 计算依据
    • 这些变量的数量是固定的,不随输入数组 nums 的大小 N 的变化而改变。
    • 算法没有创建任何新的、与输入规模成比例的数据结构(如新数组或哈希表)。

综合分析
算法所需的额外辅助空间是常数级别的。因此,其空间复杂度为 O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93106.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93106.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93106.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python-初学openCV——图像预处理(四)——滤波器

目录 一、图像噪点消除噪声&#xff1a; 1、概念 2、均值滤波 3、方框滤波 4 、高斯滤波 5、中值滤波 6、双边滤波 7、总结 一、图像噪点消除噪声&#xff1a; 1、概念 指图像中的一些干扰因素&#xff0c;通常是由图像采集设备、传输信道等因素造成的&#xff0c;表现…

嵌入式系统可靠性设计

嵌入式系统可靠性设计硬件件可靠性设计1. 硬件设计原则2. 硬件设计注意问题2.1 引脚布局和走线2.2 元器件选择和布局2.3 电源和地线分离2.4 EMI/EMC设计2.5 系统可靠性2.6 资源利用和扩展性软件可靠性设计1. 设计原则1.1 模块化设计1.2 冗余设计1.3 容错设计1.4 实时性保障1.5 …

cJSON在STM32单片机上使用遇到解析数据失败问题

我们在单片机上解析JSON格式时&#xff08;比如在用云平台物联网开发时&#xff09;&#xff0c;可以直接使用cJson库来完成自己的操作&#xff0c;而不需要单独实现&#xff0c;具体使用方法可以搜一下。 cJson&#xff1a;一个基于 C 语言的 Json 库&#xff0c;它是一个开源…

python3基础语法梳理(三)

接上一篇博客 &#x1f3ae; 猜数字小游戏 - Python版 &#x1f9e0; 游戏规则&#xff1a; 系统随机生成一个 1 到 10 的整数玩家输入猜测的数字使用 if 语句判断玩家猜得是否正确提示“猜对了”或“太大/太小了” import randomsecret_number random.randint(1, 10) att…

【docker】将已有mysql脚本导入镜像内使用

准备SQL脚本将SQL脚本&#xff08;如init.sql&#xff09;放在宿主机目录下&#xff0c;例如&#xff1a;/path/to/sql-scripts/init.sql启动MySQL容器并挂载脚本使用 -v 参数将SQL脚本挂载到容器的初始化目录&#xff1a;docker run --name mysql-container \-e MYSQL_ROOT_PA…

【机器学习深度学习】LLamaFactory微调效果与vllm部署效果不一致如何解决

目录 前言 一、问题本质 1.1 问题说明 1.2 问题本质示意 二、常见原因 LLaMAFactory对话模板规则定义 模型对话模板定义规则 三、解决方法 提取代码myset.py 创建jinja文件 安装VLLM 运行VLLM 安装运行open webui流程 四、流程梳理 前言 本文主要讲述的主要内容…

Python入门构建网页

用纯 Python 构建 Web 应用 本教程将带你从零开始&#xff0c;构建一个交互式的待办事项清单。 fasthtml 的核心哲学是“回归初心&#xff0c;大道至简”。在当今复杂的前后端分离技术栈中 &#xff0c;它提供了一条返璞归真的路径&#xff0c;旨在让你能用纯粹的 Python 构建从…

开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

Go的defer和recover

在 Go 语言中&#xff0c;defer 和 recover 是两个紧密相关的关键字&#xff0c;主要用于错误处理和资源清理。它们通常一起使用&#xff0c;特别是在处理panic&#xff08;运行时崩溃&#xff09;时&#xff0c;确保程序不会直接崩溃&#xff0c;而是能够优雅地恢复并继续执行…

Spring Boot 配置文件常用配置属性详解(application.properties / application.yml)

前言 Spring Boot 的一大优势就是通过简单的配置文件即可快速定制应用行为&#xff0c;而无需编写大量 XML 配置或 Java 代码。Spring Boot 使用 application.properties 或 application.yml 作为核心配置文件&#xff0c;支持丰富的配置属性。 本文将详细介绍 Spring Boot 常用…

uni-appDay02

1.首页-通用轮播组件 轮播图组件需要再首页和分类页使用&#xff0c;封装成通用组件 准备组件自动导入组件 <script setup lang"ts"> import XtxSwiper from /components/XtxSwiper.vue import CustomNavbar from ./components/CustomNavbar.vue </scrip…

FastAPI入门:请求体、查询参数和字符串校验、路径参数和数值校验

请求体 FastAPI 使用请求体从客户端&#xff08;例如浏览器&#xff09;向 API 发送数据。请求体是客户端发送给 API 的数据。响应体是 API 发送给客户端的数据。 使用 Pydantic 模型声明请求体&#xff0c;能充分利用它的功能和优点 from fastapi import FastAPI from pydanti…

Docker的docker-compose类比Spring的ApplicationContext

总一句话是&#xff1a;Docker Compose&#xff1a;集中化管理多个容器及其依赖的资源环境&#xff1b;ApplicationContext&#xff1a;集中化管理 多个Bean 及其运行所需的资源和依赖关系。 1. 整体概念 Docker Compose&#xff1a;用于定义和运行多容器 Docker 应用程序&…

Reason-before-Retrieve(CVPR 2025)

研究方向&#xff1a;Image Captioning论文全名&#xff1a;《Reason-before-Retrieve: One-Stage Reflective Chain-of-Thoughts for Training-Free Zero-Shot Composed Image Retrieval》1. 论文介绍组合图像检索&#xff08;CIR&#xff09;旨在检索与参考图像密切相似的目标…

Idefics2:构建视觉-语言模型时,什么是重要的

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" Idefics2&#xff1a;构建视觉-语言模型时&#xff0c;什么是重要的 摘要 随着large language models和vision transformers的进步&#xff0c;视觉-语言模型&#xff08;VLMs&#xff09;受到了越来越多的关注…

再谈fpga开发(fpga调试方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】我们之前在学校学习c、c的时候&#xff0c;其实学校漏掉了很重要的一个教学环节&#xff0c;那就是调试、测试。很多时候我们代码写出来了&#xff…

C语言中的数据结构--栈和队列(1)

前言本届开始我们将对数据结构中栈的内容进行讲解,那么废话不多说,我们正式进入今天的学习栈栈是一种很特殊的线性表&#xff0c;它只能在固定的一端进行插入和删除操作&#xff0c;进行数据的插入和删除的一端叫做栈顶&#xff0c;另外一端叫做栈底&#xff0c;栈中的元素遵守…

字符串是数据结构还是数据类型?

比较纠结的一个问题&#xff0c;以下是在网上查到后总结的&#xff0c;不知道对不对&#xff0c;欢迎讨论。这是个触及计算机科学核心概念的精妙问题&#xff01;字符串既可以被视为一种数据类型&#xff0c;也可以被视为一种数据结构&#xff0c;这取决于你观察的视角和讨论的…

Cline与Cursor深度实战指南:AI编程助手的革命性应用

引言 在AI编程工具快速发展的今天&#xff0c;Cline和Cursor作为两款备受瞩目的AI编程助手&#xff0c;正在重新定义开发者的工作方式。作为一名深度使用这两款工具的开发者&#xff0c;我在过去一年的实践中积累了丰富的经验和独到的见解。本文将从技术角度深入分析Cline和Cur…

根本是什么

根本是什么 根本没有了&#xff0c;枝叶还在么&#xff1f; 没有了内涵&#xff0c;外延还有么&#xff1f; 丢弃了根本&#xff0c;再嗨也是无意义&#xff0c;无根据空虚之乐罢了。 人之所行所言所思所想所念皆欲念、历程感怀&#xff0c;情思。所谓得失过往&#xff0c;时空…