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)
相关推荐
aqiu1111111 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS1 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b1 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人2 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全
chenbingjie_c2 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
镜子AI4 小时前
教培机构AI推荐系统实战:概念漂移检测算法——为什么“去年有效的推荐今年可能失效“
人工智能·算法
垆边人似月.5 小时前
华为OD算法题:查找众数及中位数
数据结构·算法·leetcode
hetao17338375 小时前
2026-10-08 hetao1733837 的刷题记录
c++·算法
CoderYanger6 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划