本人一直在努力地积累Leetcode上用Python实现的题,并且会尽力讲清每道题的原理,绝不像其他某些博客简略地带过。
如果觉得讲的清楚,欢迎关注。
题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5 输出: 2
示例 2:
输入: [1,3,5,6], 2 输出: 1
示例 3:
输入: [1,3,5,6], 7 输出: 4
示例 4:
输入: [1,3,5,6], 0 输出: 0
思路:最快的大概是先用二分找,找到了就返回那个找到的索引。
class Solution:
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
#因为数组有序,所以可以去除特殊情况
if target < nums[0]:
ans = 0
elif target > nums[-1]:
ans = len(nums)
l = 0
r = len(nums) - 1
#先用二分找
while l<=r:
mid = (l+r)//2
if nums[mid] < target:
l = mid+1
elif nums[mid] > target:
r = mid-1
else:
ans = mid
break
#如果跳出while时是l = mid + 1后导致的,说明我们的mid小于target,返回l的值
if l > mid:
return l
#如果跳出while时是r = mid - 1后导致的,说明我们的mid大于target,所以返回r+1,也就是mid
if r < mid:
return r+1
return ans
反思:关于插入列表的问题,如果插入元素小于当前index元素,则就插这个index的位置,若大于index的元素且小于index+1上的元素,则应该插index+1。