代码随想录 435.无重叠区间

思路:这道题需要排序。按左边界排序或右边界排序都可以,主要目的是让区间尽可能的重叠。
(一)如果按照右边界排序,从左向右记录非交叉区间的个数,最后用区间总数减去非交叉区间的个数就是需要移除的区间个数。
记录非交叉区间个数的方法如下图所示:
区间1,2,3,4,5,6都按照右边界排好序。
(1)当确定区间1和区间2重叠后,如何确定是否与区间3也重叠呢?就是取区间1和区间2右边界的最小值,因为这个最小值之前的部分一定是区间1和区间2的重合部分,如果这个最小值也触达到区间3,那么说明区间1,2,3都是重合的。
(2)接下来就是找大于区间1结束位置的区间,是从区间4开始(因为是按照右边界排序)。
(3)区间4结束之后,再找区间6,所以一共记录非交叉区间的个数是3个。
(4)总共区间个数6个,减去非交叉区间的个数3,移除区间的最小数量就是3。

(二)如果按照左边界排序,就是直接求重叠的区间,count为记录重叠区间数。
附代码:
class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,b) -> {return Integer.compare(a[0],b[0]);});int count = 1;for(int i = 1;i < intervals.length;i ++){if(intervals[i - 1][1] > intervals[i][0]){intervals[i][1] = Math.min(intervals[i][1],intervals[i - 1][1]);continue;}else{count ++;}}return intervals.length - count;}
}