import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param intervals int整型二维数组
     * @return int整型二维数组
     */
    public int[][] mergeTimeIntervals (int[][] intervals) {
        // 用于存储结果
        LinkedList<int[]> linkedList = new LinkedList<>();
        // 如果数组长度为0,直接返回空数组
        if (intervals.length == 0) {
            return new int[0][];
        }
        // 匿名内部类重写Comparator接口,这边Lambda表达式简写
        Arrays.sort(intervals, (o1, o2) -> {
            // 其实就是以第一个数字升序排,如果相等再比较第二个数字,按升序
            if (o1[0] > o2[0]) {
                return 1;
            } else if (o1[0] == o2[0]) {
                return o1[1] - o2[1];
            } else {
                return -1;
            }
        });
        // 初始化 第一次 start = 1 end = 3
        int start = intervals[0][0];
        int end = intervals[0][1];
        for (int i = 1; i < intervals.length; i++) {
            // 如果前一个的尾巴大于等于当前数的开头,意味着可以合并,比如{1,3}和{2,6}
            if (end >= intervals[i][0]) {
                // 从两个数组的尾巴中选择较大的那个来合并
                end = Math.max(end, intervals[i][1]);
            } else {
                // 如果小于,那么不能合并,单独加入集合
                linkedList.add(new int[] {start, end});
                // 重新初始化为当前数组
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        // 因为最后一次可能没有添加
        linkedList.add(new int[] {start, end});
        // 集合转二维数组
        int[][] arr = new int[linkedList.size()][2];
        for (int i = 0; i < linkedList.size(); i++) {
            arr[i] = linkedList.get(i);
        }
        return arr;
    }
}

本题知识点分析:

1.贪心算法(局部->整体,一般举例就可以了)

2.数学模拟

3.有序集合存取

4.集合转数组

本题解题思路分析:

1.其实只要搞清楚什么时候合并的就可以了,基本是数学模拟,然后翻译写代码,{1,3}和{2,6}合并成1,6

2.匿名内部类重写Comparator接口,自定义排序,这边用Lambda表达式简写

3.如果前一个的尾巴大于等于当前数的开头,意味着可以合并,比如{1,3}和{2,6},从两个数组的尾巴中选择较大的那个来合并

4. 如果小于,那么不能合并,单独加入集合,重新初始化为当前数组

5.集合转二维数组,最后返回即可

本题使用编程语言: Java