二分查找的注意事项:

  1. 初始值:left=0right=len(nums)
  2. 循环条件:left < right
  3. 中间位置计算:mid=left+((right-left)>>1)
    • 避免 left+right 出现溢出;
  4. 边界更新条件:
    • 搜索目标:
      • left=mid+1
      • right=mid-1
    • 搜索左边界:
      • left=mid+1
      • right=mid
        • 右边界更新更保守
    • 搜索右边界:
      • left=mid
      • right=mid-1
        • 和搜索左边界互为镜像
  5. 退出循环条件:
    • 搜索目标:nums[mid]==target
    • 搜索左边界:l>=r
    • 搜索右边界:l>=r
  6. 返回值(搜索不到返回 -1):
    • 搜索目标:mid-1
    • 搜索左边界:left-1
    • 搜索右边界:right-1