import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param intervals int整型二维数组
     * @return int整型二维数组
     */
    public int[][] mergeTimeIntervals (int[][] intervals) {
        // write code here
        if (intervals == null || intervals.length == 0) {
            return new int[0][2];
        }

        // 将时间区间按照开始时刻排序
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);

        List<int[]> mergedIntervals = new ArrayList<>();
        int[] currentInterval = intervals[0];

        for (int i = 1; i < intervals.length; i++) {
            if (currentInterval[1] >= intervals[i][0]) {
                // 有重叠,更新当前合并区间的结束时刻
                currentInterval[1] = Math.max(currentInterval[1], intervals[i][1]);
            } else {
                // 无重叠,将当前合并区间添加到结果列表,并更新当前合并区间
                mergedIntervals.add(currentInterval);
                currentInterval = intervals[i];
            }
        }

        // 添加最后一个合并区间
        mergedIntervals.add(currentInterval);

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

编程语言是Java。

该题考察的知识点包括:

  • 排序算法
  • 数组和列表的基本遍历

代码的文字解释:

  1. 使用 Lambda 表达式对时间区间数组 intervals 按照开始时刻进行排序。
  2. 创建一个列表 mergedIntervals,用于存储合并后的时间区间。
  3. 初始化 currentInterval 为第一个时间区间,作为当前合并区间的起始。
  4. 使用循环遍历从第二个时间区间开始的所有时间区间。
  5. 在循环中,判断当前区间与 currentInterval 是否有重叠,若有则更新 currentInterval 的结束时刻,使其覆盖重叠的部分。
  6. 若无重叠,将当前合并区间添加到结果列表 mergedIntervals 中,并将 currentInterval 更新为当前区间,准备开始新的合并区间。
  7. 将最后一个合并区间添加到 mergedIntervals 中。
  8. 使用 toArray 方法将列表 mergedIntervals 转换为二维数组,并作为函数的返回值。