二分查找
经过学习后,感觉重点就是对于边界的处理,理解区间的概念
- 边界处理
边界处理 => 中间值mid,边界区间值
区间
定义:
需要全程坚定的不变量
本题中:[left,right],[left,right)
熟悉区间的范围: 什么区间什么边界
-
右区间的左边界
-
左区间的右边界
关注:新的搜索区间如何产生,注意让它遵守原来的区间
right ] => right = num.size -1; 包含 right
right ) => right = num.size; 不包含right
这里的关注点在于两个方面:
第一个方面在于对 mid 的把握,在进行 num[mid] 与 target 的比较后,mid的值就不在之后的区间内了,因为已经判断过了。
第二个方面就是对right 起始区间的把握,如果 right )=> 取不到 right 的值 + mid 已经无关 => right = mid; 即新区间为 mid ] 还满足 right ) 的条件
right ] => right的值可以取到,在考虑的范围内 + mid 无关 => 找到新的有效区间:既要满足接下来查找的需要,还得符合闭区间的要求 => right = mid - 1;
此外,好像进行这样的位运算能够提高速度速度,加减乘除中的 / 最损耗时间
( right+left ) / 2 ----> (right+2left-left)/2 ----> left + (right -left) / 2) ------> left + ((right -left) >> 1)
总结
- 刚看到题目后感觉熟悉,但一写就废
- 看完B站的视频后,有了思路
- 自己在写的过程中,有了点动脑感觉
- 今日收获,学习 5个 番茄钟,博客 1个 番茄钟,移除元素的部分感觉还不到位 = =,先鸽掉