- 整数二分
- 浮点数二分
- 二分法的 5 种经典应用
二分的本质: 如果我们能够通过某种方式将一个区间划分成两个区间,左边区间满足某种特性;右边区间不满足某种特性。 那么我们就能够通过二分法来寻找左区间的右边端点或者右区间的左边端点
有单调性一定可以二分,但是二分不一定要有单调性
binary_search(l , r): // 模板一:寻找右区间的左端点
while l < r:
mid = (l+r)//2
if check(mid): r = mid
else: l = mid+1
binary_search(l , r): // 模板二:寻找左区间的右端点
while l < r:
mid = (l+r+1)//2
if check(mid): l = mid
else: r = mid-1
为什么是整数的时候会有很多边界问题呢? 因为整数范围缩小到 2 时候,可能进入死循环。
- leetcode: 例题 1 - 34. 在排序数组中查找元素的第一个和最后一个位置
- leetcode: 例题 2 - 74. 搜索二维矩阵
- leetcode: 例题 3 - 153. 寻找旋转排序数组中的最小值
- leetcode: 例题 4 - 81. 搜索旋转排序数组 II
- leetcode: 例题 5 - 154. 寻找旋转排序数组中的最小值 II
课后习题
binary_search(l , r): // 寻找结果
eps = 1e-6
while r - l >= eps:
mid = (l+r) / 2
if check(mid): r = mid
else: l = mid
常见的例子: 二分法求 sqrt(x)
课后习题
- leetcode: 410. 分割数组的最大值
- acwing: 519. 跳石头
- leetcode plus: 774. minimize-max-distance-to-gas-station
- acwing: 2436. 串分割
- codeforces 4 道经典题目
在算法题目中结合多种技巧解决一道题目是很常见的事,下面就给大家列举一些二分法结合其他算法的题目,这些题目就不讲解了,有问题可以在答疑群里面提出来。
数学+二分:
二分+dp: acwing: 472. 跳房子
二分+差分:acwing: 503. 借教室
贪心+二分: LIS 问题(动态规划专题讲解)