💡 不断排除不存在解的区间,直至最后剩下一个
这里归纳最重要的部分:
- 分析题意,挖掘题目中隐含的 单调性;
while (left < right)退出循环的时候有left == right成立,因此无需考虑返回left还是right;- 始终思考下一轮搜索区间是什么,如果是
[mid, right]就对应left = mid,如果是[left, mid - 1]就对应right = mid - 1,是保留 mid 还是 +1、−1 就在这样的思考中完成; - 从一个元素什么时候不是解开始考虑下一轮搜索区间是什么 ,把区间分为 2个部分(一个部分肯定不存在目标元素,另一个部分有可能存在目标元素),问题会变得简单很多,这是一条 非常有用 的经验;
- 每一轮区间被划分成 2 部分,理解 区间划分 决定中间数取法( 无需记忆,需要练习 + 理解 ),在调试的过程中理解 区间和中间数划分的配对关系:
划分
[left, mid]与[mid + 1, right],mid 被分到左边,对应int mid = left + (right - left) / 2; 划分[left, mid - 1]与[mid, right],mid 被分到右边,对应int mid = left + (right - left + 1) / 2;。 - 退出循环的时候有
left == right成立,此时如果能确定问题一定有解,返回 left 即可,如果不能确定,需要单独判断一次。