1. 程式人生 > 實用技巧 >Leetcode435.無重疊區間

Leetcode435.無重疊區間

題目連結:435.無重疊區間

思路:動態規劃。假設第i個區間至少擦除n個區間,即dp[i]=n。所以第i+1個區間需要擦除最少的區間數為dp[i+1]=min(dp[i]+1, dp[j]+cnt);其中,cnt表示第i個區間與前i-j個區間重疊了,重疊數cnt=i-j。

程式碼:

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if(intervals.length == 0) return 0;
        Arrays.sort(intervals, (a, b)->{
            if(a[0] == b[0]) return a[1] - b[1];
            return a[0] - b[0];
        });
        int[] dp = new int[intervals.length];
        dp[0] = 0;
        for(int i=1; i<intervals.length; i++){
            int j=i-1;
            while(j>=0 && intervals[j][1] > intervals[i][0]){
                j --;
            }
            if(i==1){
                dp[i] = i-j-1;
            }else{
                dp[i] = Math.min(dp[i-1] + 1, j < 0 ? i-j-1 : dp[j] + i-j-1);
            }
        }
        return dp[dp.length-1];
    }
}

執行用時:3 ms, 在所有 Java 提交中擊敗了83.29%的使用者
記憶體消耗:38.7 MB, 在所有 Java 提交中擊敗了20.68%的使用者