4. Pattern: Merge Intervals,区间合并类型

目录

力扣经典题

56. 合并区间Merge Intervals (medium)

57. 插入区间Insert Interval (medium)

986. 区间列表的交集Intervals Intersection (medium)

Conflicting Appointments (medium)


区间合并模式是一个用来处理有区间重叠的很高效的技术。在设计到区间的很多问题中,通常咱们需要要么判断是否有重叠,要么合并区间,如果他们重叠的话。这个模式是这么起作用的:

假设第一个区间的起始位置小于第二个区间的起始位置,有6种不同的情况

理解和识别这六种情况,非常重要。因为这能帮你解决一大堆问题。这些问题从插入区间到优化区间合并都有。

判断合并区间模式

  • 当你需要产生一堆相互之间没有交集的区间的时候
  • 当你听到重叠区间的时候

力扣经典题

56. 合并区间Merge Intervals (medium)

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->a[0]-b[0]);//先排好序
        int len=intervals.length;
        int[][] ans=new int[len][2];

        int a=-1;//a+1代表ans中已有区间的个数

        for(int i=0;i<len;i++){
            if(a==-1||ans[a][1]<intervals[i][0]){//设置往ans填入区间的条件
                a++;
                ans[a][0]=intervals[i][0];
                ans[a][1]=intervals[i][1];
            }else{//其他情况就是发现空间重合了,需要修改ans中的区间数据
                ans[a][1]=Math.max(ans[a][1],intervals[i][1]);
            }
        }
        return Arrays.copyOf(ans,a+1);
    }
}


class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->a[0]-b[0]);//先排好序
        int len=intervals.length;
        if(len==1){
            return intervals;
        }
        int[][] ans=new int[len][2];
        int k=0;
        int[] a=intervals[0];
        for(int i=1;i<len;i++){
            if(a[1]<intervals[i][0]){
                ans[k]=a;
                k++;
                a=intervals[i];
            }else{
                a[1]=Math.max(a[1],intervals[i][1]);
            }
        }
        ans[k]=a;
        return Arrays.copyOf(ans,k+1);
    }
}

57. 插入区间Insert Interval (medium)

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        //Arrays.sort(intervals,(a,b)->a[0]-b[0]);排序
        int len=intervals.length;
        int[][] ans=new int[len+1][2];

        if(len==0){
            int[][] res=new int[1][2];
            res[0][0]=newInterval[0];
            res[0][1]=newInterval[1];
            return res;
        }


        int a=0;//a代表ans中存在区间的个数
        int k=0;
        int g=0;
        for(int i=0;i<len;i++){//依次判断区间是否在newInterval中,若是,则
            if(intervals[i][0]>newInterval[1]||intervals[i][1]<newInterval[0]){
                if(k!=0){
                    ans[a][0]=newInterval[0];
                    ans[a][1]=newInterval[1];
                    a++;
                    k=0;
                    g++;
                }
                ans[a][0]=intervals[i][0];
                ans[a][1]=intervals[i][1];
                a++;
            }else{
                k++;
                newInterval[0]=Math.min(newInterval[0],intervals[i][0]);
                newInterval[1]=Math.max(newInterval[1],intervals[i][1]);
            }   
        }
        if(g==0){
            ans[a][0]=newInterval[0];
            ans[a][1]=newInterval[1];
            a++;
            k=0;
        }

        int[][] ans1=Arrays.copyOf(ans,a);
        Arrays.sort(ans1,(b,c)->b[0]-c[0]);

        return ans1; 
    }
}

986. 区间列表的交集Intervals Intersection (medium)

class Solution {
    public int[][] intervalIntersection(int[][] A, int[][] B) {
        List<int[]> ans=new ArrayList<>();

        int i=0,j=0;//作为标记AB当前的指针

        int len1=A.length;
        int len2=B.length;
        while(i<len1&&j<len2){
            int hi=Math.min(A[i][1],B[j][1]);
            int lo=Math.max(A[i][0],B[j][0]);

            if(hi>=lo){
                ans.add(new int[]{lo,hi});
            }

            if(A[i][1]<B[j][1]){
                i++;
            }
            else{
                j++;
            }
        }
        return ans.toArray(new int[ans.size()][]);
    }
}

Conflicting Appointments (medium)

力扣题

435. 无重叠区间

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值