[ LeetCode ] 题刷刷(Python)-第35题:搜索插入位置

题目描述

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

nums 为 无重复元素升序 排列数组

请必须使用时间复杂度为 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

解题

解法一: 二分查找

思路

二分查找(Binary Search)是一种基于比较的搜索算法,适用于已排序(升序或降序)的有序序列(如数组)。其基本思想如下:

1、初始化:确定搜索范围,通常是整个有序数组。设数组的左边界为 left,右边界为 right。

2、迭代:在每一步迭代中,计算中间索引 mid,通常是取 left 和 right 的平均值(向下取整)

(1)直接取平均值:mid = (left + right) // 2
(2)避免整数溢出:mid = left + (right - left) // 2

3、比较:将中间元素 nums[mid] 与目标值 target 进行比较:

(1)相等:如果 nums[mid] 等于 target,则找到目标值,返回 mid 作为其索引。
(2)小于:如果 nums[mid] 小于 target,说明目标值可能位于 mid 右侧的子数组中,因此缩小搜索范围至右半部分,即更新 left = mid + 1。
(3)大于:如果 nums[mid] 大于 target,说明目标值可能位于 mid 左侧的子数组中,因此缩小搜索范围至左半部分,即更新 right = mid - 1。
4、终止条件:重复步骤2和步骤3,直到找到目标值或者左右边界相遇(left > right),此时表明目标值不在数组中。

算法复杂度

时间复杂度:O(log⁡n),其中 n为数组的长度。


空间复杂度:O(1)。

代码

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 定义左右指针left, right = 0, len(nums) - 1# 如果左指针不大于右指针while left <= right:# 计算中间索引mid(防止整数溢出)mid = left + (right - left) // 2# 如果 nums[mid] 等于 target,则找到目标值,返回 mid 作为其索引。if nums[mid] == target:return mid# 如果 nums[mid] 小于 target,说明目标值可能位于 mid 右侧的子数组中# 因此缩小搜索范围至右半部分,即更新 left = mid + 1。elif nums[mid] < target:left = mid + 1# 如果 nums[mid] 大于 target,说明目标值可能位于 mid 左侧的子数组中# 因此缩小搜索范围至左半部分,即更新 right = mid - 1。else:right = mid - 1# 当 left > right 时,退出循环。# 此时 left 指向的目标位置即为目标值应插入的位置return left

解法二: 使用内置函数 bisect_left

思路

一行代码,不讲武德。

bisect_left 是 Python 标准库 bisect 模块提供的一个函数,专门用于已排序序列(如列表)的二分查找。这个函数的主要作用是返回目标值应该插入的索引,使得插入后列表依然保持有序。

算法复杂度

时间复杂度:O(log⁡n),其中 n为数组的长度。


空间复杂度:O(1)。

代码

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:return bisect_left(nums, target)

解法三: 线性查找(时间复杂度不满足)

思路

从数组的第一个元素开始,逐个比较每个元素与目标值,直到找到目标值或遍历完整个数组。找到目标值时返回其索引,未找到时返回应插入的位置。

算法复杂度

时间复杂度:O(⁡n),其中 n为数组的长度。


空间复杂度:O(1)。

代码

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:for i, num in enumerate(nums):# 如果当前num等于目标值target,返回其下标if num == target:return i# 如果当前num大于目标值target,返回其下标# 因为是升序无重复元素数,你比我大,我该排你这里# [1,2,4,5],target=3;4>3-->[1,2,3,4,5]elif num > target:return i# 都不满足,说明应插入最后的位置return len(nums)

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

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

相关文章

减肥变成一种趋势!足球直播是一种刺激——早读(逆天打工人爬取热门微信文章解读)

看直播是打发时间的好方式 引言Python 代码第一篇 洞见 跌入粪坑的钟美美&#xff0c;才是真正的“人间清醒”第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 变化是生活的法则 而直播的比赛则是这一法则的缩影 每一秒都可能带来转折和惊喜 充满了未知和奇迹 引…

磁盘损坏无法读取:原因、恢复方案与防范之道

在数字化信息爆炸的时代&#xff0c;磁盘作为数据存储的重要载体&#xff0c;承载着无数重要的文件和资料。然而&#xff0c;当磁盘突然损坏&#xff0c;无法读取数据时&#xff0c;我们往往会陷入困境&#xff0c;焦虑不已。面对这种情况&#xff0c;我们该如何应对&#xff1…

插入排序(insertionSort)

插入排序是一种简单直观的排序算法&#xff0c; 基本思想 将待排序的元素逐个插入到已经排序好的部分中的适当位置&#xff0c;从而得到新的有序序列。核心思想是不断地比较和移动元素&#xff0c;直到找到合适的插入位置。 插入排序的特点&#xff1a; 稳定性&#xff1a;插…

Yolo-world使用

1、安装 python pip install ultralytics 前往官网下载模型&#xff1a;https://docs.ultralytics.com/models/yolo-world/#key-features 我这里使用yolov8s-world.pt举例 最简单的使用示例 if __name__ __main__:model YOLO(model/yolov8s-world.pt)results model.pre…

中仕公考:考公还是考编?区别是什么?

公务员和事业编应该如何选择?区别在哪里?中仕为大家总结以下几点&#xff0c;看完就明白了! 事业编制&#xff1a;主要指从事事业单位工作人员所获得的稳定的事业单位编制。 公务员&#xff1a;是指在各级政府机关中&#xff0c;行使国家行政职权&#xff0c;执行国家公务的…

Ubuntu的apt命令用法汇总

在Ubuntu系统中&#xff0c;apt 是一个十分常用的包管理工具&#xff0c;用于安装、更新、卸载和管理软件包。 本文将汇总apt 命令的用法&#xff0c;以便你更好地利用Ubuntu系统进行软件管理。 一. 安装软件包要安装一个软件包&#xff0c;使用以下命令&#xff1a; sudo a…

pyhton学习之-分支结构-运费计算模板-第二练

第1关:运费计算模板第二练-地区运费计算模板 任务描述 现在有一个淘宝店铺,发货地在天津,店主设计了一个运费规则如下图所示: 可以选择区域来指定每件商品的运费,达到一定的购买金额以后可以包邮 测试说明 计算运费 根据地区和购买数量计算运费。 输入:北京,1件 输出:…

2024HW ---->内网横向移动

在蓝队的面试过程中&#xff0c;如果你会内网渗透的话&#xff0c;那是肯定的一个加分选项&#xff01;&#xff01;&#xff01; 那么从今天开始&#xff0c;我们就来讲一下内网的横向移动&#xff01;&#xff01;&#xff01; 目录 1.域内任意用户枚举 2.Password-Sprayi…

ffmpeg入门

ffmpeg入——安装 Fmpeg地址 FFmpeg源码地址&#xff1a;GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git FFmpeg可执行文件地址&#xff1a;Download FFmpeg Windows平台 ​ ​ Windows平台下载解压后如图所示&#xff08;文件名称以-share结尾的…

深入剖析Spring框架:循环依赖的解决机制

你好&#xff0c;我是柳岸花开。 什么是循环依赖&#xff1f; 很简单&#xff0c;就是A对象依赖了B对象&#xff0c;B对象依赖了A对象。 在Spring中&#xff0c;一个对象并不是简单new出来了&#xff0c;而是会经过一系列的Bean的生命周期&#xff0c;就是因为Bean的生命周期所…

如何添加所有未跟踪文件到暂存区?

文章目录 如何将所有未跟踪文件添加到Git暂存区&#xff1f;步骤与示例代码1. 打开命令行或终端2. 列出所有未跟踪的文件3. 添加所有未跟踪文件到暂存区4. 验证暂存区状态 如何将所有未跟踪文件添加到Git暂存区&#xff1f; 在版本控制系统Git中&#xff0c;当我们首次创建新文…

Java每日面试题

Java 高级面试问题及答案 问题1: Java中的垃圾回收机制是如何工作的&#xff1f;请描述一下垃圾收集器的工作原理。 答案: Java的垃圾回收机制主要依赖于垃圾收集器&#xff08;Garbage Collector&#xff0c;GC&#xff09;&#xff0c;它负责自动回收不再使用的对象&#x…

最全!2024腾讯春招Spring Circuit Breaker面试题大全,附详解和技巧,必备收藏!

面对2024年腾讯春季招聘&#xff0c;准备充分的技术面试答案至关重要&#xff0c;尤其是在微服务架构和高可用性设计方面。Spring Circuit Breaker作为维持微服务稳定性和可靠性的关键技术&#xff0c;了解其工作原理和实际应用对于任何希望在当今技术驱动的环境中取得成功的软…

安全狗云眼的主要功能有哪些?

"安全狗云眼"是一款综合性的网络安全产品&#xff0c;主要用于实时监控和保护企业的网络安全。其核心功能包括威胁检测、漏洞扫描、日志管理和合规性检查等。 以下是安全狗云眼的主要功能详细介绍&#xff1a; 1、资产管理 定期获取并记录主机上的Web站点、Web容器、…

【科大讯飞笔试题汇总】2024-04-21-科大讯飞春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新科大讯飞近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&…

卷积神经网络 (CNN)

计算机视觉最常见的机器学习模型体系结构之一是卷积神经网络 (CNN)。 CNN 使用筛选器从图像中提取数值特征图&#xff0c;然后将特征值馈送到深度学习模型中以生成标签预测。 例如&#xff0c;在图像分类方案中&#xff0c;标签表示图像的主要主题&#xff08;换句话说&#xf…

Go 之常用并发学习

在 Go语言实战 中看到有些并发相关的例子&#xff0c;讲解得也比较详细&#xff0c;于是乎写来加深下印象。 无缓冲通道 无缓冲通道在接收前没有能力保存任何值。我自己找了书上的示例来加深一下印象。 模拟网球比赛 package mainimport ("fmt""math/rand&q…

微信有关白名单IP

一、商家支付 二、公众号

开启智慧之旅,AI与机器学习驱动的微服务设计模式探索

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;开启智慧…

基于SpringBoot + Vue实现的时装购物管理系统设计与实现+毕业论文+开题报告+答辩PPT

介绍 系统包含用户、管理员两个角色 管理员&#xff1a;首页、个人中心、用户管理、商品分类管理、颜色管理、商品信息管理、商品评价管理、系统管理、订单管理 用户:首页、个人中心、商品评价管理、我的收藏管理、订单管理 前台首页:首页、商品信息、商品资讯、个人中心、后台…