Non-overlapping Intervals

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:

  1. You may assume the interval's end point is always bigger than its start point.
  2. 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.

分析:

The following greedy algorithm does find the optimal solution:

  1. Select the interval, x, with the earliest finishing time.
  2. Remove x, and all intervals intersecting x, from the set of candidate intervals.
  3. Repeat until the set of candidate intervals is empty.

Whenever we select an interval at step 1, we may have to remove many intervals in step 2. However, all these intervals necessarily cross the finishing time of x, and thus they all cross each other. Hence, at most 1 of these intervals can be in the optimal solution. Hence, for every interval in the optimal solution, there is an interval in the greedy solution. This proves that the greedy algorithm indeed finds an optimal solution.

 1 class Solution {
 2     public int eraseOverlapIntervals(int[][] intervals) {
 3         if (intervals.length == 0) {
 4             return 0;
 5         }
 6 
 7         Arrays.sort(intervals, (interval1, interval2) -> interval1[1] - interval2[1]);
 8         int end = intervals[0][1];
 9         int count = 1;
10 
11         for (int i = 1; i < intervals.length; i++) {
12             if (intervals[i][0] >= end) {
13                 end = intervals[i][1];
14                 count++;
15             }
16         }
17         return intervals.length - count;
18     }
19 }
上一篇:ifconfig配置网络时,出现“SIOCSIFADDR: No such device”


下一篇:【LeetCode-java实现】56. Merge Intervals合并区间