题目链接: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%的用户