刷题网站:Leetcode
难度: 简单
语言: Python
计划:从简单——>到中等——>再到难。
一、35搜索插入位置
1.1 问题描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为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
- 示例4
输入:nums = [1,3,5,6],target=0
输出:0
- 示例5
输入:nums = [1],target=0
输出:0
1.2 思考分析
从题目描述来看,很像数组的二分查找那一题,但是注意有点不一样。那一题是不在数组中的值需要返回-1
,而此题则是对应插入位置。
其实不难发现,重点是target
不在数组中时,它是比了最后一个较小的数(即相同位置索引+1),还是比了最后一个较大的数(即相同位置索引)。
最后比的一个数肯定是最接近target的一个数,即插入的位置要么在这个数前面,要么在这个数后面加1。
例如,将示例2带入运算可知,target=2
最后是和索引位置为0处较小的数1进行了比较,所以对应的位置应该加1,即0+1。
例如,将示例4带入运算可知,target=0
最后是和索引位置为0处较大的数1进行了比较,所以对应的位置应该为相同位置,即0。
了解了基本的算法思想,前面的算法与数组的二分查找相同,我们带入几次运算发现,其实最后的位置都是left
返回的值,即插入的位置索引值,因此只需在最后加上返回索引位置,即
return left
故完整代码应为:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left = 0
num = len(nums) - 1
while left<=num:
mid = left + (num-left)//2
if target == nums[mid]:
return mid
elif target>nums[mid]:
left = mid + 1
else:
num = mid - 1
return left
1.3 总结
这题与之前的数组二分查找类似,但是需要注意满足不在数组中,应该插入的位置与最后比较数的关系。