题目:704,278
-
xxxxyyyyyy逼近类,无限逼近xy交界处—感觉这种就相当于底下那种查找类中target不存在的情况
- 题目链接
- 取中值,中值属于交界处右边就让右边逼近,反之亦然,临近最后的结构肯定是x|y,然后在这上面做文章
- 两边同时偏移(+1)left=mid+1左边就会越过中线—这种情况下因为除法是向零取整,所以左边会先跨线
- left=mid不会越过中线
- 根据题意,以及上面这两种情况调节跳出循环的条件
-
xxxxxyxxxx查找类,查找y的位置
- 力扣题目链接
- 这里要考虑循环不变量原则
- 当你的right=0,left=nums.size()时,这时你的right ==left在区间[right,left)上是无意义的—因为右端点是不存在的,所以底下设置while条件时只能是left<right, if(num[mid1]>target)则right更新为mid1,这时num[mid1]不等于target,即下一个区间不会去比较num[mid1]
- 当不存在target时,因为当这个num[mid]卡在界限右边,left卡在左边,因为除法向0取整,所以左边就会left=mid+1,最后叠在right上打破循环条件退出去
- 当存在target时,如在数组:1,2,3,4,7,9,10中查找元素3,如图所示:这儿如果-1,那么前面那个数可能是但直接就被排除了,因为比较不到它
- 当你的right=0,left=nums.size()时,这时你的right ==left在区间[right,left)上是无意义的—因为右端点是不存在的,所以底下设置while条件时只能是left<right, if(num[mid1]>target)则right更新为mid1,这时num[mid1]不等于target,即下一个区间不会去比较num[mid1]
- 当你的right=0,left=nums.size()-1时,这时你的right ==left在区间[right,left)上是有意义的,if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1,如果写成middle,target存在的话造成不定影响,增加或减少比较次数,但target不存在的话就会导致达到临界时左边跨过界限,跟右边叠到一块而陷入死循环
-
大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则