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

devtools/2024/11/14 20:16:57/

题目描述

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

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)。

代码

python">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)。

代码

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

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

思路

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

算法复杂度

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


空间复杂度:O(1)。

代码

python">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.ppmy.cn/devtools/8109.html

相关文章

TensorFlow 1.x的学习

.为什么还有很多人都选择使用TensorFlow 1.x 兼容性问题: TensorFlow 1.x在一些旧项目中已经得到了广泛应用&#xff0c;这些项目可能依赖于1.x版本的特定API或行为。升级到2.x可能需要大量的代码修改和测试工作&#xff0c;对于一些已经稳定运行的项目&#xff0c;维护者可能…

蓝桥杯 BASIC-16 基础练习 分解质因数

蓝桥杯 BASIC-16 基础练习 分解质因数 问题描述 求出区间[a,b]中所有整数的质因数分解。 输入格式 输入两个整数a&#xff0c;b。 输出格式 每行输出一个数的分解&#xff0c;形如ka1*a2*a3…(a1<a2<a3…&#xff0c;k也是从小到大的)(具体可看样例) 样例输入 3 10 样例输…

sql~ 将一行转为多行

转义字符 在正则表达式中&#xff0c;\\[|\\] 是一个模式&#xff0c;它匹配的是字符 [ 或者 ] | 是一个特殊字符&#xff0c;表示“或”操作&#xff0c;也就是说&#xff0c;它会匹配它左边或者右边的字符\\[ 和 \\] 是对特殊字符 [ 和 ] 的转义&#xff0c;因为在正则表达式…

.NET高级面试指南专题二十五【 建造者模式介绍,将复杂对象的构建过程与其表示分离】

建造者模式是一种创建型设计模式&#xff0c;用于将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。它允许客户端通过指定要构建的类型和可选参数来构建对象&#xff0c;而不需要了解对象的具体构建细节。 优点&#xff1a; 将构建过程封装…

如何用JS校验HTTP和HTTPS地址

在日常开发过程中&#xff0c;我们有时候对某些应用功能进行封装&#xff0c;但是在请求接口又不能写死&#xff0c;这个时候我们需要对他进行多方面考虑。 如何验证请求地址是HTTP还是HTTPS 方法一&#xff1a; function getBaseUrl (string) {let url;try {url new URL(s…

C#字典底层原理

一&#xff1a;前言 Dictionary是一种键值对的形式存放数据&#xff0c;即 key和value一一映射。key的类型没有限制&#xff0c;可以是整数、字符串甚至是实例对象 C#字典源码 时间复杂度 ——Add&#xff1a;O(1) ——Remove&#xff1a;一般情况下为O(1)&#xff0c;最差情…

【opencv】dnn示例-person_reid.cpp 人员识别(ReID,Re-Identification)系统

ReID(Re-Identification&#xff0c;即对摄像机视野外的人进行再识别) 0030_c1_f0056923.jpg 0042_c5_f0068994.jpg 0056_c8_f0017063.jpg 以上为输出结果&#xff1a;result文件夹下 galleryLIst.txt queryList.txt 模型下载&#xff1a; https://github.com/ReID-Team/ReID_e…

VUE识别图片文字OCR(tesseract.js)

效果:1&#xff1a; 效果图2&#xff1a; 一、安装tesseract.js npm i tesseract.js 二、静态页面实现 <template><div><div style"marginTop:100px"><input change"handleChage" type"file" id"image-input"…