Leetcode刷题56(合并区间)

题目描述:

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路:

先将所有列表按第一个元素排列好顺序。比如a=[1,5],b=[2,7],因为a[1]>b[0],所以两个列表有重合部分。数列左边已经确定为a[0],只要比较a[1]和b[1]谁大即可。用left来记录数列左区间,用right来记录数列右区间。然后将一个个列表分别加入到大列表中。

通过答案:

class Solution {
    public int[][] merge(int[][] intervals) {
        int len=intervals.length;      //列表数量
        List<int[]> res=new ArrayList<>();    //大列表
        if (intervals == null || intervals.length == 0)
            return res.toArray(new int[0][]);
        //Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        Arrays.sort(intervals,new Comparator<int[]>(){    //按每个列表第一个元素排列,如果a1[0]>a2[0]就交换顺序
            public int compare(int[] a1,int[] a2){
                return a1[0]-a2[0];
            }
        });
        int i=0;
        while(i<len){
            int left=intervals[i][0];     //记录左区间
            int right=intervals[i][1];    //记录右区间
            while(i<len-1&&intervals[i+1][0]<=right){    
                i++;
                right=Math.max(intervals[i][1],right);   //大范围的那个为右区间
            }
            res.add(new int[]{left,right});   //将列表加入(注意)
            i++;
        }
        return res.toArray(new int[0][]);   //输出结果
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值