56. 合并区间

难度 medium
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例 1:

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

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

提示:

1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104

解题思路:这道题目还是不难的,就是有几个地方要注意一下,一个是要重写sort方法的compare函数,这里用了匿名类的方法实现,主要是实现二维数组的排序,对二维数组里的每个数组num,先按第一个数排序,第一个数相等的情况下按第二个数排序,然后,就是用一个left和right记录当前区间的左右边界,并且往前遍历,判断是否可以合并到当前区间,当下一个数组的第一个数比当前right小的时候,需要进行一次合并,右边界更改为下一个数组的第二个数和当前right中的最大值,因为可能出现[1,4],[2,3]这种情况,当无法满足下一个数组的第一个数比当前right小的时候,就把结果先保存,然后left和right更新为下一个数组的第一和第二个数,继续往下遍历,主要还有最后一个需要注意的地方,那就是二维数组遍历之后,需要把最后一个数组所代表的区间边界加入结果中。

代码 t75 s5

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>(){
            public int compare(int[] a, int[] b){
                if(a[0]==b[0]){
                    return a[1] - b[1];
                }else{
                    return a[0] - b[0];
                }
            }
        });
        List<int[]> ans = new ArrayList<>();
        int left = intervals[0][0], right = intervals[0][1];
        for(int i=1; i<intervals.length; i++){
            if(right>=intervals[i][0]){
                right = Math.max(right, intervals[i][1]);
            }else{
                int[] t = {left, right};
                ans.add(t);
                if(i<intervals.length){
                    left = intervals[i][0];
                    right = intervals[i][1];
                    // System.out.println("left: " + left + " right: " + right);
                }
            }
        }
        ans.add(new int[]{left, right});
        int[][] res = ans.toArray(new int[0][]);
        return res;
    }
}

参考资料
https://blog.csdn.net/qq_41682302/article/details/95949646
http://c.biancheng.net/view/916.html

上一篇:2.合并区间(LeetCode第56题)


下一篇:Pairwise 找到你的另一半