Skip to content

主要记录一下二分算法三种不同区间的写法

闭区间写法、左开右闭区间写法、开区间写法 发现自己还是更喜欢闭区间写法 但好像开区间的写法会更加快速一点

  • 闭区间写法
python
def lower_bound(nums: List[int], target: int) -> int:
    left, right = 0, len(nums) - 1  # 闭区间 [left, right]
    ##这里为等号
    while left <= right:  # 区间不为空
        # 循环不变量:
        # nums[left-1] < target
        # nums[right+1] >= target
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1  # 范围缩小到 [mid+1, right]
        else:
            right = mid - 1  # 范围缩小到 [left, mid-1]
    return left
  • 左闭右开区间写法
python
def lower_bound2(nums: List[int], target: int) -> int:
    left = 0
    right = len(nums)  # 左闭右开区间 [left, right)
    ##这里不为等号
    while left < right:  # 区间不为空
        # 循环不变量:
        # nums[left-1] < target
        # nums[right] >= target
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1  # 范围缩小到 [mid+1, right)
        else:
          ##右边每次等于mid而不是减一
            right = mid  # 范围缩小到 [left, mid)
    return left  # 返回 left 还是 right 都行,因为循环结束后 left == right
  • 开区间写法
python
def lower_bound3(nums: List[int], target: int) -> int:
    left, right = -1, len(nums)  # 开区间 (left, right)
    ##这里left + 1 < right
    while left + 1 < right:  # 区间不为空
        mid = (left + right) // 2
        # 循环不变量:
        # nums[left] < target
        # nums[right] >= target
        if nums[mid] < target:
            left = mid  # 范围缩小到 (mid, right)
        else:
            right = mid  # 范围缩小到 (left, mid)
    return right

如有转载或 CV 的请标注本站原文地址