二分查找总结
1、if里面写想要找到的逻辑的相反,保证if 的逻辑简单;
2、while (left < right) ,left == right ,把区间分成2个部分;(注意:只有一个与元素的情况另外写出来)
3、当把mid置于左半边right = mid left = mid+1,则mid向下取整int mid = left + (right - left) / 2 ;当把mid置于右半边left = mid right = mid - 1,则mid向上取整int mid = left + (right - left) / 2 + 1;
4、mid的取值
(1)int mid = (left + right) / 2;在 left 和 right 较大的时候,left + right 会发生整型溢出,变成负数;
(2)int mid = left + (right - left) / 2;在 right较大、 left 是较小的负数时, right - left 也有可能超过 int 类型能表示的最大值,但一般情况下 left 和 right 表示的是数组索引值,left 是非负数,因此 right - left 溢出的可能性很小;
(3)int mid = (low + high) >>> 1;在 Java中,这样取中位数;
5、若区间里一定存在target,退出 while (left < right) 以后,返回 left 或者 left 代表的值就可以,否则还要单独做一次判断:if(nums[left] == target) return left;