题目描述
解题思路
只做简单的判断:一个个区间进行判断,模拟最大区间,如果新加入的区间存在超过当前最大区间的范围,则进行更新,否则计数。
反思:没仔细阅读题目,题目说的意思不是得到最大区间,而是争取保留更多的区间数。
正确代码的思路:使得保留的区间覆盖范围越小,这样可以容忍的区间就越大。这里使用的是贪心算法。按照起点进行排序,如果新加入的区间起点大于当前区间的终点,则加入并计数,否则判断新加入区间的终点与当前区间的终点哪个更小。满足容纳更多区间与互不重叠的原则。
代码实现
错误代码一
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int res=0;
int len=intervals.length;
if(len==1) return 0;
int [] temp=new int[2];
temp[0]=intervals[0][0];
temp[1]=intervals[0][1];
for(int i=1;i<len;i++){
if(intervals[i][0]<temp[0]){
temp[0]=intervals[i][0];
}
else{
if(intervals[i][1]>temp[1]){
temp[1]=intervals[i][1];
}
else{
res++;
}
}
}
return res;
}
}
正确代码实现
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int size=0;
int len=intervals.length;
if(len==1) return 0;
// 根据区间的开头进行排序,
Arrays.sort(intervals,(a,b)->a[0]-b[0]);
int right=Integer.MIN_VALUE;
for(int i=0;i<len;i++){
if(intervals[i][0]>=right){
right=intervals[i][1];
size++;
}
else{
if(intervals[i][1]<right){
right=intervals[i][1];
}
}
}
int res=len-size;
return res;
}
}
问题记录
非常奇怪,没想清楚为啥移除的是两个,而不是三个。。。
心得:困难像弹簧,,,