非独立思考!

    1. class Solution {
    2. public int[][] merge(int[][] intervals) {
    3. // 特值处理
    4. if (intervals.length == 0) {
    5. return new int[0][2];
    6. }
    7. // 先按照第一个元素对数组排序
    8. // 这个方法学习一下
    9. Arrays.sort(intervals, new Comparator<int[]>() {
    10. @Override
    11. public int compare(int[] o1, int[] o2) {
    12. return o1[0] - o2[0];
    13. }
    14. });
    15. List<int[]> mergedList = new ArrayList<>();
    16. // 排完序后,先将第一个加入区间数组的末尾
    17. for (int i = 0; i < intervals.length; i++) {
    18. // 依次检查下一个区间,该区间的左端点大于末尾的区间的右端点时,直接加入区间数组
    19. // 否则证明他们可以合并
    20. // !!!将末尾区间的右端点的值改为该区间的右端点的值!!!这种思路不对!!!
    21. // 区间的2个值都将使用,一个对比,一个修改
    22. int L = intervals[i][0], R = intervals[i][1];
    23. if (mergedList.size() == 0
    24. || mergedList.get(mergedList.size() - 1)[1] < L) {
    25. // 直接加入mergedList
    26. mergedList.add(intervals[i]);
    27. } else {
    28. // 将其与当前的最后一个区间合并,不是简单直接合并
    29. // 因为并非直接将当前区间的右端点赋值过去,取2个区间右端点的最大值
    30. mergedList.get(mergedList.size() - 1)[1] =
    31. Math.max(mergedList.get(mergedList.size() - 1)[1], R);
    32. }
    33. }
    34. return mergedList.toArray(new int[mergedList.size()][]);
    35. }
    36. }