
coffeescript
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
while left <= right:
mid = (left+right)//2 # 中间索引
if nums[mid] > target:
right = mid -1 # mid 已经比较过,不能再参与下一轮
elif nums[mid] < target:
left = mid +1
else:
return mid # nums[mid] == target 返回坐标
# 循环结束时 left > right
# 此时:right 指向最后一个 < target 的位置
# left 指向第一个 ≥ target 的位置
# 如果找不到 target,返回它应该插入的位置(left)
return left
为什么不能是:while left < right:,只能是while left <= right:
coffeescript
right = mid - 1
left = mid + 1
这种更新方式是给:
coffeescript
while left <= right
例子
coffeescript
nums = [1,3]
target = 3
初始:
coffeescript
left = 0
right = 1
mid = 0
nums[0] = 1 < 3
left = mid + 1 = 1
现在:
coffeescript
left = 1
right = 1
如果循环条件是:
coffeescript
while left < right
1 < 1 → False
循环直接结束!
如果循环条件是:
coffeescript
while left <= right
1 <= 1 → ture
循环继续!
left = 1
right = 1
mid = 1
nums[0] = 1 = 3
返回索引