二分法(含 gift 演示)
二分法
二分法原理很简单,但是细节是魔鬼
寻找一个数
当我们使用 while 循环条件是 left <= right 的时候,我们的最后情况是 left = right + 1 最后的范围就相当于 [right+ 1, right] 这样的区间不存在,所以如果不存在的话,那么我们直接返回 -1 就可以。
但是当我们的搜索区间是 [left,rigfht) 的时候我们最后退出的 left 是等于 right 的,所以最后我们需要判断 nums[left] == target
寻找两个数的边界
寻找左边界
两种写法
1)使用,左闭右开的形式
gift 演示:

后期熟练之当然可以写的更加简单,但是现阶段还是需要自己仔细写
2)使用,左闭右闭的形式
下面是进行到一个特殊的情况的时候:
这个时候我们会发现,黄色的箭头指的是 mid 的位置,这个时候我们的 left 位置在 0 , right 的位置在 2 位置,那么下一次运行 while 里面的时候,我们的 right = mid - 1,也就是在 0 的位置,此时 mid < target 我们的 left = mid + 1;也就变成了 1 的位置,此时 right < left 也就是 left = right + 1 循环结束!!!所以最后我们判断的都是 left 因为 left 可能会越界,但是 right 就不会越界,right 是不会越过左边界的。这是因为在每一步迭代中,如果 nums[mid] > target,那么搜索区间会变成 [left, mid-1],也就是说,right 会被更新为 mid - 1。就是在最左侧的时候我们这时候 left 都不会越过 index 是 0 的位置

找到左边的 index 需要 去靠近
gift 演示:

寻找右边界
也是两种写法,和上面寻找左边界一样
1)使用,左闭右开的形式
gift 演示

2)使用,左闭右闭的形式
gift 演示

总结
最后 labuladong 推荐的是左闭右闭的形式,我也感觉这种考虑的还算是比较少的
只需要改 nums[mid] == target 条件下的情况 ,还有找哪一个返回哪一个并且判断哪一个的边界条件
