二分答案法适用于“最大化最小值”问题,其核心特征是答案具有单调性且check函数可快速验证可行性;典型场景如分组使每组和的最小值最大、放置点使最小间距最大;答案范围易定,check函数用贪心或遍历判断“所有局部结果≥x”是否成立。

二分答案法适用的“最大化最小值”问题长什么样
能用 二分答案 解的“最大化最小值”,核心特征是:答案具有单调性,且验证某个候选答案是否可行足够快(通常 ≤ O(n) 或 O(n log n))。典型场景比如:把数组分成 k 组,使每组和的最小值尽可能大;或在坐标轴上放 m 个点,使任意两点间最小距离最大。
关键判断点:不是对原数组二分,而是对「可能的答案」二分。答案范围往往可快速确定——下界通常是 0 或最小元素,上界是总和、最大元素或坐标极差。
怎么写 check 函数:决定 mid 是否可行
check(x) 的作用是:判断“能否安排方案,使得所有局部结果都不小于 x”。它不关心最优,只回答“行不行”。写错 check 是最常见翻车点。
- 对于分组类问题(如力扣 410. 分割数组的最大值 的反向),
check(x)常用贪心策略:从左到右累加,一旦 ≥ x 就切一刀,统计能切出几组;若组数 ≥ k,说明 x 可行 - 对于距离类问题(如力扣 875. 爱吃香蕉的珂珂 的变形),
check(x)判断“最小间距 ≥ x”是否成立,常用双指针或排序后遍历实现 - 务必注意边界:x = 0 时多数情况应返回 true;x 极大时一定 false;
check中避免整数溢出(如累加和用long long)
二分主逻辑:左闭右开还是左闭右闭
推荐统一用 左闭右闭(l = L, r = R),循环条件为 l ,更新时 <code>r = mid - 1 或 l = mid + 1。这样最终 l 就是满足条件的最大答案(即“最大化”的解)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
示例框架:
int l = L, r = R, ans = L; while (l <p>注意:<code>mid</code> 计算必须用 <code>l + (r - l) / 2</code> 防止溢出;<code>ans</code> 要显式记录,不能直接返回 <code>r</code> —— 因为退出时 <code>r</code> 可能已失效。</p><h3>容易被忽略的细节:精度、类型与初始化</h3><p>整数二分看似简单,但三处极易出错:</p>
- 答案范围初始化错误:比如求“最小距离最大”,上界不能设成
max_element,而应是*max_element - *min_element - 变量类型不匹配:当数组元素和可能超
int,l/r/mid必须用long long,否则二分过程就溢出 - 浮点数场景(少见但存在):若答案是实数,需固定迭代次数(如 60 次)而非判断
r - l > eps,避免死循环
真正卡住人的从来不是二分模板,而是 check 的逻辑是否严密覆盖所有边界情况,以及答案上下界的推导是否经得起反例检验。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










