一、二分查找模板
模板 1:左闭右闭 left, right
区间含义:left 和 right 都代表能取到的有效下标
模板2:左闭右开 [left, right)
right 是取不到的边界,数组长度作为初始 right

二、边界处理重点
1、mid 计算:mid = left + (right-left)/2,不要写(left+right)/2,left+right过大时会整数溢出
2、循环条件判断
left,right:left <= right,左右相等时区间还有一个元素,仍然要判断
[left,right):left < right,left 等于 right 区间就空了
3、更新左右指针
如果 mid 位置的值不是 target,mid 一定要排除在外
目标在右边:left = mid +1
目标在左边:right = mid -1(闭区间模板)
4、适用场景:普通查找、找左边界、找右边界(找第一个 / 最后一个满足条件的元素)
三、旋转有序数组知识点
概念:原本升序数组,在某个点旋转,分成两段有序子数组,例如 4,5,6,7,0,1,2
特点:局部有序,整个数组不是完全有序,但其中一半一定是有序的。
二分思路:判断 mid 左边还是右边是有序区间,看 target 是否落在有序区间内,再收缩区间。
重点:
1、每次取 mid,先判断左半段 left,mid 是否有序
2、如果左半有序:判断 target 是否在numsleft ≤ target < numsmid,是就去左边,否则去右边
3、如果右半有序:判断 target 是否在numsmid < target ≤ numsright,是就去右边,否则去左
4、注意:数组存在重复元素时,无法判断哪边有序,需要right--缩小范围(进阶)