Python学习日记009——搜索插入数字
搜索插入数字
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
Example1:
输入: [1,3,5,6], 5
输出: 2
Example2:
输入: [1,3,5,6], 2
输出: 1
Example3:
输入: [1,3,5,6], 7
输出: 4
Example4:
输入: [1,3,5,6], 0
输出: 0
搜索插入数字——暴力求解
解决这个问题,首先想到的方法是暴力穷举法,即从数组中的第一个元素开始,判断题中所给target值与它的关系。如果target值在数组中,那么可以找到其所在位置。如果target值不在数组中,那么可以找到介于target值两侧的两个元素,即 nums[i] < nums[i+1]。但是暴力穷举法消耗的时间较长,因此可以寻求其他方法。
搜索插入数字——二分查找法
二分查找是对列表值进行查找的另一种常用方法,其使用前提是列表中的元素必须是事先排好序的。二分查找法的优点在于,每次比较之后都排除了一半的元素。
本文对待此问题,分成两个大部分来解决。首先需要判断题中所给的target值是否在数组中。
①对于target值在数组中的情况,我们即可以利用二分查找法去查找target值所在的位置。我们分别用 low 和 high 来表示列表中当前要查找的第一个下标和最后一个下标。初始情况下, low 是 0 ,high 是 len(nums)-1,mid 表示中间元素的下标,因此 mid = ( low + high ) // 2。
二分过程具体如下:
if target < nums[mid]:
high = mid - 1
elif target == nums[mid]:
return mid
else:
low = mid + 1
经过多次二分,直到找到 target == nums[mid]结束,返回 mid 的值。
②对于target值不在数组中的情况,因为数组中的元素是按顺序排列的,因此当我们从头遍历数组时,找到第一个大于 target 值的元素时,插入数组按序则应该插在这个元素的前面,即这个元素原来的位置。如果数组中所有元素都比target值小,那么该target值应该插在数组最后。
具体实现过程如下:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
"""search-insert-position"""
if target in nums: #target值在数字内
low = 0 #初始状态要查找的第一个下标
high = len(nums) - 1 #初始状态要查找的最后一个下标
while high >= low:
mid = (low + high) // 2 #中间元素的下标
if target < nums[mid]:
high = mid - 1
elif target == nums[mid]:
return mid
else:
low = mid + 1
else: #target值不在数组内
for i in range(len(nums)):
if nums[i] > target:
return i
return i+1
还看到了另一种用内置函数解决问题的方法,其通过添加、排序、查找三个步骤即解决了问题,代码特别简洁明了:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
"""search-insert-position"""
nums.append(target)
nums.sort()
return nums.index(target)
因此对于不同的方法,根据实际情况可灵活选择。