LeetCode 435 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:
  • 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.

    タイトルリンク:https://leetcode.com/problems/non-overlapping-intervals/description/
    テーマ分析:まず貪欲で最大の重ならない区間の個数を求め(end順に並べて、スキャン)、もう一度減らせば(70%を打ち負かす)
    /**
     * 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; }
     * }
     */
    class Solution {
        
        public int eraseOverlapIntervals(Interval[] intervals) {
            int n = intervals.length;
            if (n == 0) {
                return 0;
            }
            Comparator  cmp = new Comparator() {
                public int compare(Interval i1, Interval i2) {
                    if (i1.end > i2.end) {
                        return 1;
                    } else if (i1.end < i2.end) {
                        return -1;
                    } else {
                        if (i1.start > i2.start) {
                            return 1;
                        } else if (i1.start < i2.start) {
                            return -1;
                        } else {
                            return 0;
                        }
                    }
                }
            };
            Arrays.sort(intervals, cmp);
            int maxSeg = 1, cur = intervals[0].end, i = 1;
            while (i < n) {
                while (i < n && intervals[i].start < cur) {
                    i++;
                }
                if (i < n) {
                    cur = intervals[i].end;
                    maxSeg++;
                }
                i++;
            }
            return n - maxSeg;
        }
    }