type
Post
status
Published
date
May 3, 2026
slug
qjtx
summary
tags
算法
category
icon
password

概述

区间贪心算法是解决区间调度问题的经典算法,核心思想是通过某种贪心策略选择区间,以达到最优解。这类问题通常涉及时间、空间等资源的分配与选择。

经典问题一:区间调度(最大不相交区间)

问题描述

给定n个区间 [start_i, end_i],选择尽可能多的不相交区间。

贪心策略

按区间结束时间从小到大排序,每次选择结束时间最早的区间。

算法思路

  1. 将所有区间按结束时间升序排序
  1. 选择第一个区间(结束时间最早的)
  1. 遍历剩余区间,如果当前区间的开始时间大于等于上一个选中区间的结束时间,则选择该区间

正确性证明(交换论证法)

假设存在最优解OPT和贪心算法解GREEDY,且GREEDY不是最优解。我们可以通过交换论证证明贪心解的最优性: - 设贪心算法选择的第一个区间为I₁,最优解选择的第一个区间为J₁ - 由于按结束时间排序,end(I₁) ≤ end(J₁) - 可以用I₁替换J₁,得到的新解仍然是最优解 - 递归应用此论证,可证明贪心解是最优的

洛谷例题:P1803 凌乱的yyy / 线段覆盖

题目链接:https://www.luogu.com.cn/problem/P1803
题目描述:现在有n个区间,要求选出尽可能多的区间,使得这些区间两两不相交。
解题思路: - 将区间按右端点从小到大排序 - 贪心选择右端点最小的区间 - 维护上一个选中区间的右端点,判断当前区间是否可选

经典问题二:区间覆盖(最少区间覆盖)

问题描述

给定一个区间 [l, r],选择尽可能少的子区间完全覆盖该区间。

贪心策略

每次选择能覆盖当前位置且右端点最大的区间。

算法思路

  1. 将所有区间按左端点从小到大排序
  1. 从目标区间左端点开始,每次选择能覆盖当前位置且右端点最远的区间
  1. 更新当前位置为选中区间的右端点
  1. 重复直到覆盖整个目标区间

洛谷例题:P2082 区间覆盖(加强版)

题目链接:https://www.luogu.com.cn/problem/P2082
题目描述:给定n个闭区间和一个目标区间,用这n个区间覆盖目标区间,求最少需要多少个区间。
解题思路: - 按左端点排序 - 从左到右贪心选择,每次选择能覆盖当前点且右端点最远的区间 - 注意处理无法覆盖的情况

经典问题三:区间选点(最少点覆盖)

问题描述

给定n个区间,选择尽可能少的点,使得每个区间都至少包含一个点。

贪心策略

按区间结束时间排序,每次在区间结束位置选点。

算法思路

  1. 将所有区间按结束时间升序排序
  1. 在第一个区间的结束位置选一个点
  1. 遍历剩余区间,如果当前区间的开始时间大于已选点的位置,则在该区间结束位置选新点

洛谷例题:P1250 种树

题目链接:https://www.luogu.com.cn/problem/P1250
题目描述:有一条公路,需要在这条公路的某些位置种树,使得每个要求的区间内至少有一棵树,求最少需要种多少棵树。
解题思路: - 将区间按右端点排序 - 贪心地在每个需要覆盖的区间的右端点种树 - 使用数组记录已种树的位置

算法对比总结

问题类型
目标
排序策略
贪心选择
时间复杂度
空间复杂度
区间调度
最多不相交区间
按右端点升序
选择右端点最小的可用区间
O(n log n)
O(1)
区间覆盖
最少区间覆盖目标
按左端点升序
选择覆盖当前点且右端点最大的区间
O(n log n)
O(1)
区间选点
最少点覆盖所有区间
按右端点升序
在区间右端点选点
O(n log n)
O(1)

常见变体与技巧

1. 区间长度限制

2. 带权区间调度

3. 环形区间问题

算法复杂度分析

时间复杂度

  • 排序阶段:O(n log n) - 所有区间贪心问题都需要排序
  • 贪心选择阶段:O(n) - 单次遍历
  • 总体复杂度:O(n log n)

空间复杂度

  • 基础版本:O(1) - 原地操作,仅用常数空间
  • 存储结果版本:O(n) - 需要存储选中的区间或点
  • 动态规划版本:O(n) - 需要DP数组

实际应用场景

1. 资源调度

  • 会议室分配:公司会议室预约系统,最大化会议室利用率
  • CPU任务调度:操作系统进程调度,最小化等待时间
  • 车辆调度:物流公司车辆路径规划

2. 网络优化

  • 带宽分配:网络带宽资源的合理分配
  • 信道分配:无线通信中信道的选择与分配
  • 服务器负载均衡:分布式系统中任务分配

3. 生产制造

  • 生产线调度:工厂生产任务的合理安排
  • 设备维护:设备维护时间窗口的规划
  • 质量控制:产品检测时间段的安排

常见陷阱与注意事项

1. 边界条件处理

2. 排序稳定性

3. 特殊情况处理

4. 数据类型选择

练习题推荐

入门级

进阶级

高级

总结

区间贪心算法是一类重要且实用的算法,其核心在于:
  1. 正确识别问题类型:明确是求最大值还是最小值
  1. 选择合适的排序策略:根据问题特点确定排序关键字
  1. 设计贪心选择策略:在每一步做出局部最优选择
  1. 证明算法正确性:通常使用交换论证法或数学归纳法
  1. 处理边界情况:注意区间的开闭性和特殊情况
掌握区间贪心算法不仅能够解决经典的区间问题,还能为解决更复杂的优化问题提供思路和基础。通过大量的练习和实际应用,可以加深对这些算法的理解和掌握。
面向对象数论: 整除 & 同余 & 欧拉函数, 约束和公式 & 唯一分解定理
Loading...