Leetcode35.搜索插入位置

好长时间不登csdn怎么发文都开始有额度限制了。

从今天开始决心java转py了,但是py基础贼差,又不想看网课熟悉,只能通过做题不断地去熟悉了,顺便再把基础算法巩固一下。

题目

思路

这题本质上是一个二分查找,但是和其不同的是,二分查找通常是找不到target就返回-1,而这道题找不到target则返回target将会被按顺序插入的位置。后者换句话来讲就是,target要去这排已经按身高排好队的人里插队,它得找到第一个身高比自己高或一样高的人,然后硬挤到那个人前面。

下面代码中,while部分其实就是传统二分查找算法,唯一不同的是,如果没有找到target,我们要额外返回一个target将被插入进去的位置,即left。

为什么要返回left?

因为本质上我们要到第一个比target值大或者等于的元素下标,然后把target塞到这个元素前边,又因为left下标往左的所有元素值肯定都是小于target的,只要当前值小于target,left就往右移;同理,right下标往右的所有元素值都是大于target的,只要当前值大于target,right就左移。所以当while循环跳出来之后(找不到target),left一定是落在第一个大于等于target值的元素身上,所以直接返回left即可。

代码如下。

代码

python 复制代码
class Solution:
    def searchInsert(self, nums: list[int], target: int) -> int:
        left = 0
        right = len(nums) - 1
        ans = 0
        while (left <= right) :
            mid = left + ((right - left) // 2)
            if (nums[mid] == target) :
                return mid
            elif (nums[mid] < target) :
                left = mid + 1
            else :
                right = mid - 1
        return left
        

当然,如果不是为了做题的话,也可以直接用python内置的二分查找标准库bisect来完成这个任务。

python 复制代码
import bisect
nums = list(map(int, input().split()))
target = int(input())
a = bisect.bisect_left(nums, target)
print(a)
相关推荐
微尘hjx5 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
路灯上の马陈7 小时前
二叉树的定义与性质
数据结构·二叉树·树结构·1024程序员节
小蒋观天下9 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
Bshaya_10 小时前
红黑树详解:概念、规则与插入实现
数据结构·红黑树·二叉搜索树·平衡树·插入逻辑
WBluuue11 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
圣保罗的大教堂11 小时前
leetcode 3619. 总价值可以被 K 整除的岛屿数目 中等
leetcode
路灯上の马陈12 小时前
数据结构-树
数据结构·1024程序员节
澳鹏Appen12 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin12 小时前
Java数据结构 二叉搜索树
数据结构·算法