Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.

Note:
You may assume the interval's end point is always bigger than its start point.
Intervals like [1,2] and [2,3] have borders "touching" but they don't overlap each other.
Example 1:
Input: [ [1,2], [2,3], [3,4], [1,3] ] Output: 1 Explanation: [1,3] can be removed and the rest of intervals are non-overlapping.
Example 2:
Input: [ [1,2], [1,2], [1,2] ] Output: 2 Explanation: You need to remove two [1,2] to make the rest of intervals non-overlapping.
Example 3:
Input: [ [1,2], [2,3] ] Output: 0 Explanation: You don't need to remove any of the intervals since they're already non-overlapping.

Actually, the problem is the same as "Given a collection of intervals, find the maximum number of intervals that are non-overlapping." (the classic Greedy problem: Interval Scheduling). With the solution to that problem, guess how do we get the minimum number of intervals to remove? : )

Sorting Interval.end in ascending order is O(nlogn), then traverse intervals array to get the maximum number of non-overlapping intervals is O(n). Total is O(nlogn).

开始的时候想岔了,以为是要求同一时刻overlap的最多interval数,但仔细想一想就发现不对,应该是non-overlap的interval的最大数目

1. Best solution: sorted by interval end

case 1 add current interval as another non-overlapping interval, case 2 and case 3 all get rid of the current interval

 /**
* 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;
int nonOverlap = 1;
int seq = 0;
Arrays.sort(intervals, new Comparator<Interval>() {
public int compare(Interval i1, Interval i2) {
return i1.end - i2.end;
}
});
for (int i=1; i<intervals.length; i++) {
if (intervals[i].start >= intervals[seq].end) {
seq = i;
nonOverlap++;
}
}
return intervals.length - nonOverlap;
}
}

Comparator can also be rewritten as

 Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[1], i2[1]));

2. Alternatives(not the best): sort by interval start

case 1 add current interval as another non-overlapping interval, case 2 update the previous non-overlapping interval with the current one, and case 3 get rid of the current interval. So more cases need to be processed than sorted by interval end

 class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length < 1) return 0;
int seq = 0;
int nonOverlap = 1; Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0])); for (int i = 0; i < intervals.length; i ++) {
if (intervals[i][0] >= intervals[seq][1]) {
seq = i;
nonOverlap ++;
}
else if (intervals[i][1] <= intervals[seq][1]) {
seq = i;
}
} return intervals.length - nonOverlap;
}
}

最新文章

  1. Windows下 C++ 实现匿名管道的读写操作
  2. python基本数据结构-字典-方法
  3. ##DAY13——可视化编程之XIB
  4. Ubuntu的Java环境变量
  5. Java字符编码浅析
  6. 安利给班里的大家一个chrome的GitHub插件-----gayhub
  7. 类String 初识
  8. [Swift]LeetCode736. Lisp 语法解析 | Parse Lisp Expression
  9. Injection with CDI (Part I)
  10. mysql调优最大连接数
  11. 【理论面试篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题
  12. 在Centos 6.5 X64下切割m3u8
  13. Git 打标签(分布式版本控制系统)
  14. 41-json.decoder.JSONDecodeError: Invalid control character at: line 6894 column 12 (char 186418)
  15. xcrun: error: invalid active developer path (/Applications/Xcode.app/Contents/Developer)解决办法
  16. static的应用
  17. Immediately-Invoked Puzzler
  18. python使用md5处理下载图片
  19. HDU 5305 Friends dfs
  20. Unity3d 背景、音效 播放 简单demo

热门文章

  1. 【noiOJ】p7939
  2. POJ 1321 简单dfs
  3. win7 64位DCOM配置(关于导出excel 配置计算机组件服务)(转)
  4. do some projects in macine learning using python
  5. jQuery设计思想之取值和赋值
  6. HDU 5762
  7. HTML5初学篇章_3
  8. sql实现对多个条件分组排序方法和区别
  9. Java代理模式
  10. 生成一行html