学习leetcode-搜索插入位置
使用二分法查找目标值并插入对应有序列表。该经典算法印象中由牛顿最先使用,流程为:
从列表首尾开始建立左右指针,每次索引折中,对比折中的值和目标值。如果小于目标值,那么目标值一定在折中值右边,因此左指针赋值为折中值+1,否则目标值一定在折中值左边,因此右指针赋值为折中值-1。
其中折中有两种方式计算,一种就是简单的除以二后取整。对于严格升序列表(不存在重复元素)向上向下取整都可以。
另一种折中方式为移位。这里需要除以2,因此使用右移位。通过移位来实现除法显然是基于二进制。例如9/2。9=1001,右移一位后最末尾的1被去掉变成100=4。因此至少对于正整数的移位运算是向下取整(这对于二分已经足够了)
代码如下
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
n = len(nums)
left = 0
right = n-1
while left <= right:
mid = int(((right - left) / 2) + left)
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left