无重叠区间

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

  1. 可以认为区间的终点总是大于它的起点。
  2. 区间 [1,2] 和 [2,3] 的边界相互"接触",但没有相互重叠。

示例 1:

输入: [ [1,2], [2,3], [3,4], [1,3] ]

输出: 1

解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: [ [1,2], [1,2], [1,2] ]

输出: 2

解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: [ [1,2], [2,3] ]

输出: 0

解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

【题目分析】

这个题目与《算法导论》中活动安排的题目非常类似。

活动选择问题
有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。

考虑使用贪心算法的解法。为了方便,我们用不同颜色的线条代表每个活动,线条的长度就是活动所占据的时间段,蓝色的线条表示我们已经选择的活动;红色的线条表示我们没有选择的活动。
如果我们每次都选择开始时间最早的活动,不能得到最优解:

如果我们每次都选择持续时间最短的活动,不能得到最优解:

可以用数学归纳法证明,我们的贪心策略应该是每次选取结束时间最早的活动。直观上也很好理解,按这种方法选择相容活动为未安排活动留下尽可能多的时间。这也是把各项活动按照结束时间单调递增排序的原因。

【思路】

参照上面活动安排的例子,我们很容易得到这个题目的解法。这是一个贪心问题,我们每次都找到那个结束点最小的区间,然后依次向后找那些与前面区间不冲突且结束点早的区间。这个过程中我们把局部的最优解合并成了全局的最优解。

 /**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public int eraseOverlapIntervals(Interval[] intervals) {
if(intervals.length == 0) return 0; Comparator<Interval> comp = new Comparator<Interval>() {
public int compare(Interval interval1, Interval interval2) {
if(interval1.end > interval2.end) return 1;
else if(interval1.end < interval2.end) return -1;
else return 0;
}
}; Arrays.sort(intervals, comp);
int lastend = intervals[0].end;
int remove = 0;
for(int i = 1; i < intervals.length; i++) {
if(intervals[i].end == lastend) remove++;
else if(intervals[i].start < lastend) remove++;
else lastend = intervals[i].end;
} return remove;
}
}

最新文章

  1. 【转】如何查看当前Open的Cursor
  2. android工程中menu的使用总结
  3. iphone 浏览器自动解析数字为号码解决方法
  4. 【Linux驱动】内核等待队列
  5. Java RTTI机制与反射机制
  6. 浅析Java内存模型
  7. Java OOM
  8. Leetcode027. Remove Element
  9. 全栈一路坑之使用django创建博客
  10. 模拟Hibernate动态生成SQL语句
  11. [Unity Shader]光照模型对物体的假设
  12. 解决div里面img标签后面跟着空白符
  13. java sql
  14. C语言求矩阵的逆
  15. MT【85】正整数系数
  16. Linux运维基础命令笔试题--看看你会多少?
  17. Angular基础开始
  18. SQL Server 中几个有用的特殊函数
  19. mysql优化利器之explain
  20. KISS

热门文章

  1. C#调用C++接口返回字符串的做法
  2. Android的bitmap和优化
  3. python(一)
  4. MySQL表的碎片整理和空间回收小结
  5. 一键部署WordPress开源内容管理系统
  6. AutoIt上传非input控件方式的文件脚本
  7. SqlServer中提示和报错信息的翻译
  8. [学习笔记] Markdown语法备忘
  9. [学习总结] python语言学习总结 (一)
  10. BOM属性对象方法