LeetCode热题100--56.合并区间--中等

1. 题目

以数组 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] 可被视为重叠区间。

2. 题解

class Solution {
    public int[][] merge(int[][] intervals) {
        //如果区间为空,直接返回空数组
        if(intervals.length == 0){
            return new int[0][0];
        }
        //按左端点大小排序
        Arrays.sort(intervals, new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2){
                return o1[0] - o2[0];
            }
        });
        List<int[]> ans = new ArrayList<>();
        //合并区间
        for(int i = 0; i < intervals.length; i++){
            //当前区间的左右端点
            int lef = intervals[i][0], rig = intervals[i][1];
            //如果当前区间的左端点小于等于上一个区间的右端点,合并区间
            while((i + 1 < intervals.length) && intervals[i+1][0] <= rig){
                rig = Math.max(rig, intervals[i+1][1]); //合并区间
                i++;
            }
            //加入答案
            ans.add(new int[]{lef,rig});
        }
        //以数组形式返回答案
        return ans.toArray(new int[ans.size()][0]);
    }
}

3. 解析

  1. class Solution {:这是定义一个名为Solution的新类,该类包含一个方法merge(int[][] intervals)。
  2. public int[][] merge(int[][] intervals):这是声明一个公共方法merge,参数是一个二维整数数组intervals。返回值类型是int[][],表示合并后的区间列表。
  3. if(intervals.length == 0){ return new int[0][0]; }:如果输入的区间数量为0,则直接返回一个空二维数组,避免后续代码执行错误。
  4. Arrays.sort(intervals, new Comparator(){…}):这是对输入的区间数组进行排序,按照每个子数组的第一个元素(即左端点)大小顺序进行升序排列。
  5. List ans = new ArrayList<>();:创建一个新的ArrayList对象ans来存储最终的答案。
  6. 接下来的循环中,我们遍历了已经按照开始时间排好序的区间数组。对于每一个当前区间,如果它和前一个选择的区间重叠(即它的左端点小于等于前一个区间的右端点),那么我们就需要合并这两个区间。
  7. ans.add(new int[]{lef,rig});:将当前已经处理过的所有重叠区间添加到答案中。
  8. 最后,返回ans的数组形式表示,即通过return ans.toArray(new int[ans.size()][0]);完成。

你可能感兴趣的:(LeetCode热题100,leetcode,算法,职场和发展)