二分查找

Apr 25, 2024
2 views
Algorithm

💡 不断排除不存在解的区间,直至最后剩下一个

这里归纳最重要的部分:

  • 分析题意,挖掘题目中隐含的 单调性;
  • 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 即可,如果不能确定,需要单独判断一次。