435. 无重叠区间
本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互"接触",但没有相互重叠。
看到题目的第一想法
移除区间
先排序,使用linkedList,把排序好的存入,遍历看是否重叠,若重叠则移除前一个,从前往后移除
且count++,i--
\[1,100\],\[11,22\],\[1,11\],\[2,12\]\] 这个案例没实现
##### 看到代码随想录之后的想法
若重叠,则把两者的右区间更新为两个的最小的右区间,看与下面是否重叠,result++
若不重叠,则往下走
##### 自己实现过程中遇到的困难
记住这种操作方式,如果重叠则更新两者的最右边
有时候可以倒过来想问题,比如说重叠做什么操作,我们可以先想一下若不重叠我们先做什么操作
这道题若不重叠,则跳过,若重叠,则更新右边界
class Solution {
//public int eraseOverlapIntervals(int[][] intervals) {
/*//移除后不重叠
//找到一个和多个区间重叠的
//先排序 若右边界<=下一个左边界 则不重叠
//若前一个右边界>下一个左边界则重叠,移除前一个
//第一个值升序排列,第二个值降序
//[[1,100],[11,22],[1,11],[2,12]] 这个案例没实现
Arrays.sort(intervals,(a,b)->{
if(a[0]==b[0]) return b[1]-a[1];
return a[0]-b[0];
});
int remove=0;
LinkedList 示例 2: 先排序,然后把所有的数组放入一个linkedList中 看linkedlist中是否有重叠区间 ,若重叠了则把linkedList中的那个元素移除,同时修改第一个元素 然后再继续 list先存放第一个元素 若不重叠则add,若重叠则把当前list中的最后一个元素右边界修改,再继续往下遍历(右边界不是修改为当前元素的右边界,而是两者中的最大值) list转成int list.toArray(new int[list.size()][]) 先考虑不重叠的再考虑重叠的,倒过来想一下,如果一开始想重叠的就会比较繁琐
看到题目的第一想法
看到代码随想录之后的想法
自己实现过程中遇到的困难
class Solution {
/*public int[][] merge(int[][] intervals) {
//如果重叠,则把第一个的第二个元素换成第二个的第二个元素,删除第二个元素
Arrays.sort(intervals,(a,b)->{
return a[0]-b[0];
});
LinkedList<int[]> list = new LinkedList<>();
for(int[] i:intervals){
list.add(i);
}
for(int i=0;i<list.size()-1;i++){
if(list.get(i)[1]>=list.get(i+1)[0]){
list.get(i)[1]=Math.max(list.get(i)[1],list.get(i+1)[1]);
list.remove(i+1);
i--;
}
}
return list.toArray(new int[list.size()][]);
}*/
//卡哥做法不需要删除(时间复杂度比我的提升了70ms)
public int[][] merge(int[][] intervals) {
//如果重叠,则把第一个的第二个元素换成第二个的第二个元素,删除第二个元素
Arrays.sort(intervals,(a,b)->{
return a[0]-b[0];
});
ArrayList<int[]> list = new ArrayList<>();
//卡哥做法不需要把所有元素放到数组里,只需要放第一个
list.add(intervals[0]);
//判断,如果重叠了,则更新上一个,如果没重叠,则加入到数组中
for(int i=1;i<intervals.length;i++){
if(list.get(list.size()-1)[1]>=intervals[i][0]){
//前一个永远在list中,前一个的右边界换成,前后两者右边界的最大值
list.get(list.size()-1)[1]=Math.max(list.get(list.size()-1)[1],intervals[i][1]);
}else{
list.add(intervals[i]);
}
}
return list.toArray(new int[list.size()][]);
}
}