正文
“二分搜索 + 贪心算法”是一种极高频的进阶算法组合。它通常用于解决“最大化最小值”或“最小化最大值”的问题。这种问题的特点是直接计算很难,但“给定一个答案,验证其是否可行”却非常简单。
算法模板
1 | fun solve(nums: IntArray, k: Int): Int { |
使用说明
核心思想:
将搜索对象从“索引”转变为“答案”。我们在答案的可能范围内进行二分,利用贪心策略验证每一个猜测。适用场景:
- 最大化最小值:如“分割数组的最大值”、“木棍切割问题”、“安排牛舍”。
- 最小化最大值:如“完成任务的最少时间”。
核心步骤:
- Step 1:明确答案的取值范围(
left和right)。 - Step 2:编写
check函数,通常使用贪心策略在 $O(N)$ 时间内完成验证。 - Step 3:根据
check的结果和求最值的类型(最大/最小),决定指针移动方向。
- Step 1:明确答案的取值范围(
注意点:
- 确保搜索空间是单调的。
check函数的逻辑直接决定了算法的正确性。- 对于大数求和,注意
right的溢出问题(必要时改用Long)。