[TOC]
二分查找
只需要把握两个点,直接起飞:
1)left、right写成开区间
2)把握循环不变量
Template
left, right = -1, n
while left + 1 < right: # 开区间不为空
# 循环不变量:
# f(left) >= k
# f(right) < k
mid = (left + right) // 2
if f(mid) >= k: left = mid # 下一轮二分 (mid, right)
else: right = mid # 下一轮二分 (left, mid)
return left
Leetcode 题单
- 最大化最小值 (这种题目一定要想二分)
- 二分答案(按照难度分排序)
875. 爱吃香蕉的珂珂
1283. 使结果不超过阈值的最小除数
2187. 完成旅途的最少时间
2226. 每个小孩最多能分到多少糖果
1870. 准时到达的列车最小时速
1011. 在 D 天内送达包裹的能力
2064. 分配给商店的最多商品的最小值
1760. 袋子里最少数目的球
1482. 制作 m 束花所需的最少天数
1642. 可以到达的最远建筑
1898. 可移除字符的最大数目
778. 水位上升的泳池中游泳
2258. 逃离火灾
- 第 k 小/大(部分题目还可以用堆解决)
373. 查找和最小的 K 对数字
378. 有序矩阵中第 K 小的元素
719. 找出第 K 小的数对距离
786. 第 K 个最小的素数分数
1439. 有序矩阵中的第 k 个最小数组和
2040. 两个有序数组的第 K 小乘积
2386. 找出数组的第 K 大和
- 最小化最大值
2439. 最小化数组中的最大值
2513. 最小化两个数组中的最大值
2560. 打家劫舍 IV
2616. 最小化数对的最大差值
- 最大化最小值
1552. 两球之间的磁力
2517. 礼盒的最大甜蜜度
2528. 最大化城市的最小供电站数目