目录
435 无重叠区间
763 划分字母区间
56 合并区间
435 无重叠区间
将intervals数组按照左端点进行升序排序。
设置变量len标志此时新加入端点后所有区间的位置,将其赋初值为第一对区间的右端点,因为该点是一定可达的。设置变量res来存储需要移除空间的数量。
遍历intervals数组,有如下两种情况
- 如果当前区间右端点小于或者等于新区间的左端点,说明可以将新区间加入到总区间中,将len赋值为新区间的右端点。
- 如果当前总区间右端点大于新区间的左端点,说明加入发生了冲突,将res++。局部最优是在保证res较小的情况下使得总区间范围尽可能小,如果发生以下情况,即当前总区间右端点大于新区间的右端点,为了使得较小区间总范围较小,我们应该放弃上一个端点选择新端点,所以应该进行判断使得len为总区间右端点和新区间右端点之间的最小值。
import java.util.Arrays;
class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(o1, o2) -> {if(o1[0] == o2[0]){return o1[1] - o2[1];}return o1[0] - o2[0];});int res = 0;int len = intervals[0][1];for(int i = 1;i < intervals.length;i++){if(len <= intervals[i][0]){len = intervals[i][1];}else{res++;len = Math.min(len,intervals[i][1]);}}return res;}
}
时间复杂度O(nlogn)排序的时间复杂度为nlogn,遍历的时间复杂度为n
空间复杂度O(logn)排序所需要的栈空间