题目
https://leetcode-cn.com/problems/non-overlapping-intervals/
方法一:贪心
区间调度问题
一个很经典的贪心问题是区间调度问题。
分析
代码
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int len=intervals.length;
if(len==0)
return 0;
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] interval1,int[] interval2){
return interval1[1]-interval2[1];
}
}
);
int sum=1;
int min=0;
for(int i=1;i<len;i++){
if(intervals[i][0]>=intervals[min][1]){
min=i;
sum++;
}
}
return len-sum;
}
}
复杂度
结果
方法二:动态规划
分析
使用动态规划的方法求出区间数量的最大值。
代码
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int len=intervals.length;
if(len==0)
return 0;
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] interval1,int[] interval2){
return interval1[0]-interval2[0];
}
}
);
int[] f=new int[len];
Arrays.fill(f,1);
int max=f[0];
for(int i=1;i<len;i++){
for(int j=0;j<i;j++){
//前一个区间的右端点小于等于当前区间左端点,不重叠
if(intervals[j][1]<=intervals[i][0]){
f[i]=Math.max(f[i],f[j]+1);
}
}
//f中的最大值:以i为最后一个区间时,区间数量的最大值
max=Math.max(max,f[i]);
}
return len-max;
}
}