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);  //输入为{{1,2},{1,2},{1,2}}时,j会小于0,此时,第i个区间与前面所有区间重叠,需要擦除的区间为i前所有区间
            }
        }
        return dp[dp.length-1];
    }
}

执行用时:3 ms, 在所有 Java 提交中击败了83.29%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了20.68%的用户

原文地址:https://www.cnblogs.com/liuyongyu/p/14216818.html