LeetCode 435 無重疊區間

李傻2019發表於2020-12-20

LeetCode 435 無重疊區間

題目:

給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。

注意:

可以認為區間的終點總是大於它的起點。
區間 [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

解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。

思路

https://leetcode-cn.com/problems/non-overlapping-intervals/solution/tan-xin-suan-fa-zhi-qu-jian-diao-du-wen-ti-by-labu/

  1. 從區間集合intervals中選擇一個區間 x ,這個x 是當前所有區間中結束最早的(end 最小)
  2. 把所有與 x 區間相交的區間從區間集合中intervals中刪除
  3. 重複步驟1和步驟2,直到intervals為空為止,之前選出的那些 x 就是最大不相交子集

程式碼

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if(intervals.length == 0) return 0;
        //按end升序排序
        Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] a,int[] b){
                return a[1]-b[1];
            }
        });
        //至少一個區間不相交,最大不相交子集的個數
        int count = 1;
        //排序後第一個區間就是x , [[start,end]]
        int x_end = intervals[0][1];
        for (int[] interval : intervals){
            int start = interval[0];//一維陣列的起始
            if(start >= x_end){
                //找到了下一個選擇的區間
                count++;
                x_end = interval[1];
            }
        }
        //已知不相交子集的個數,當區間集合的長度減去不相交子集的個數,得出需要移除區間的最小數量
        return intervals.length - count;
    }
}

相關文章