435. 无重叠区间
``class Solution
{
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[1] - b[1]);
int eraseCount = 0;
int end = intervals[0][1];
int length = intervals.length;
for (int i = 1; i < length; i++) {
if (intervals[i][0] >= end) {
end = intervals[i][1];
} else {
eraseCount++;
}
}
return eraseCount;
}
}
``
在剩余区间无重叠的情况下,计算需要移除的最少区间,等价于计算可以保留的最多区间。
为了将保留的区间数量最大化,应保留结束位置最小的区间。理由如下:假设保留的区间中,结束位置最小的区间是 [start1,end1],
其余保留的区间的结束位置都大于等于 end1,考虑区间 [start2,end2],其中 end2<end1,则将区间 [start1,end1]
替换成区间 [start2,end2] 之后,保留的区间仍无重叠,且可以保留的区间一定不会更少。
根据上述分析,可以得到贪心策略:首先将区间按结束位置升序排序,然后每次在剩余区间中选择结束位置最小的区间保留。该贪心策略可以将保留的区间数量最大化,将移除的区间数量最小化。
具体做法是,将区间数组 intervals 按结束位置升序排序之后,保留 intervals[0],用 end 表示上一个保留的区间的结束位置,初始时 end=intervals[0][1]。对于 i>0,当遍历到区间 intervals[i] 时,执行如下操作。
如果 intervals[i][0]≥end,则可以保留区间 intervals[i],将 end 更新为 intervals[i][1]。
如果 intervals[i][0]<end,则不能保留区间 intervals[i],将移除的区间数量加 1。
遍历结束之后,即可得到需要移除的最少区间数量。
参考storm大神写法
浙公网安备 33010602011771号