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.集合转二维数组,最后返回即可