对于区间问题,我们需要根据情况判断区间按开头排序还是按结尾排序。 此题中因为希望区间尽可能多,而区间最大的的最大值的不变的,所以我们在选择非重复区间的时候尽可能的选择结尾较小的(贪心)
将二维数组重写排序,要想升序直接返回左边减右边,降序反之
排序之后,从左到右遍历,左边末端大于右边首端,则有重复区间(用pre记录左边的) 有重复区间,pre不变,继续与下一个比较 没重复区间,pre向下移,与下一个比较
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//排序
Arrays.sort(intervals,(a,b) -> a[1] - b[1]);
int count = 0;
int pre = intervals[0][1]; //前一个区间的结尾
for(int i = 1;i < intervals.length;i++){
if(intervals[i][0] < pre) count++;
else{
pre = intervals[i][1];
}
}
return count;
}
}
时间复杂度快速排序O(nlogn) 空间复杂度O(nlogn)