好长时间不登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)