思想:
对含答案的区间进行二分处理,每次将区间一分为二,并只保留含答案的区间,当区间长度为1时,这个区间里的数就是答案。(此时 l == r)
二分和单调性的关系:
有单调性的一定可以二分,但可以二分的不一定有单调性,即没有单调性也可以二分。
何时用二分:
最优化问题(如求最长的长度)求解很困难时,可将问题转化为判定问题:判定一个数合不合法,合法看右边有没有更大值;不合法再看左边找最优解
二分模板总结
浮点数二分(无需考虑边界问题)
- 浮点数二分解题步骤:
1.取含答案的区间[l, r]。
2.根据题意找到一个具有二段性的判断条件,并且使答案一定是该二段性的分界点。
3.分析中点mid = (l + r) / 2 在该判断条件下是否成立。
如果成立,考虑答案在哪个区间;
如果不成立,考虑答案在哪个区间。
4.确定更新方式r = mid 或 l = mid。
1
整数二分(需要考虑边界问题)
- 整数二分解题步骤:
1.取含答案的区间[l, r]。
2.根据题意找到一个具有二段性的判断条件,并且使答案一定是该二段性的分界点。
3.分析中点mid在该判断条件下是否成立。
如果成立,考虑答案在哪个区间;
如果不成立,考虑答案在哪个区间。
4.当分段点左侧满足性质时,r = mid,否则 l = mid+ 1,mid = l + r >> 1;
当分段点右侧满足性质时,l = mid,否则 r = mid - 1, mid = l + r + 1 >> 1.)
中间值属于右区间,用上取整;属于左区间,用下取整。 - 题目归纳
分巧克力
旋转数组的最小数字
LeetCode_最长公共前缀
附:浮点数二分循环结束条件:
区间精度至少要比题目要保留的小数位数高2位。
(以上题目均引自AcWing) ↩︎