【刷题1】LeetCode 56. 合并区间 java题解

题目

https://leetcode-cn.com/problems/merge-intervals/
在这里插入图片描述

class Solution {
    public int[][] merge(int[][] intervals) {
        int len=intervals.length;
        if(len==0) return new int[0][2];
        Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[] p1,int[] p2){
                if(p1[0]!=p2[0])
                    return p1[0]-p2[0];
                else
                    return p1[1]-p2[1];
            }
        });
        int[] before=intervals[0];
        ArrayList<int[]> list=new ArrayList<>();
        for(int i=1;i<len;i++){
            int[] cur=intervals[i];
            if(before[1]<cur[0]){
                list.add(before);
                before=cur;
            }
            else if(before[1]==cur[0]){
                before[1]=cur[1];
            }
            else{
                if(cur[1]<=before[1]){
                    //before的前后不变
                }
                else{
                    before[1]=cur[1];
                }
            }
        }
        list.add(before);
        int[][] res=new int[list.size()][2];
        for(int i=0;i<list.size();i++){
            res[i]=list.get(i);
        }
        return res;
    }
}

分析

对每个区间的左边界进行升序的排序。然后遍历所有区间,如果前一个区间的右边界<=后一个区间的左边界,则表示它们有重叠,进行合并。
注意:前一个区间的右边界可能>当前区间的右边界,
所以要Math.max(list.get(list.size()-1)[1],intervals[i][1]) 选较大值。
不然就会出现这样的错误↓
在这里插入图片描述

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        ArrayList<int[]> list=new ArrayList<int[]>();
        Arrays.sort(intervals,(x,y)->(x[0]-y[0]));//排序
        for(int i=0;i<intervals.length;i++){
            //不重叠
            if(list.size()==0||list.get(list.size()-1)[1]<intervals[i][0]){
                //直接加入
                list.add(new int[]{intervals[i][0],intervals[i][1]});
            }
            //有重叠,修改上一个区间为合并当前区间后的
            else{
                list.get(list.size()-1)[1] = Math.max(list.get(list.size()-1)[1],intervals[i][1]);
            }
        }

        return list.toArray(new int[list.size()][]);
    }
}

复杂度

时间复杂度:O(nlogn),其中 n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O(nlogn)。

空间复杂度:O(logn),其中 n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。O(logn) 即为排序所需要的空间复杂度。

结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值