题目

image.png

思路

  • 以左边起点排序后,只要逐个比较右边大小即可

    代码

    1. public int[][] merge(int[][] intervals) {
    2. if (intervals.length == 0) {
    3. return new int[0][2];
    4. }
    5. Arrays.sort(intervals, new Comparator<int[]>() {
    6. public int compare(int[] interval1, int[] interval2) {
    7. return interval1[0] - interval2[0];
    8. }
    9. });
    10. List<int[]> merged = new ArrayList<int[]>();
    11. for (int i = 0; i < intervals.length; ++i) {
    12. int L = intervals[i][0], R = intervals[i][1];
    13. if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {
    14. merged.add(new int[]{L, R});
    15. } else {
    16. merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);
    17. }
    18. }
    19. return merged.toArray(new int[merged.size()][]);
    20. }
    21. //自己实现排序
    22. public int[][] merge(int[][] intervals) {
    23. int len = intervals.length;
    24. if (len <= 1) return intervals;
    25. for (int i = 1; i < len; i++) {
    26. int j = i - 1;
    27. int[] val = intervals[i] ;
    28. while (j >= 0 && intervals[j][0] > val[0]) {
    29. intervals[j + 1] = intervals[j];
    30. j--;
    31. }
    32. intervals[j + 1] = val;
    33. }
    34. List<int[]> res = new ArrayList<>();
    35. for (int i = 1; i < len; i++) {
    36. if (intervals[i - 1][1] >= intervals[i][0]) {
    37. intervals[i][0] = intervals[i - 1][0];
    38. if (intervals[i- 1][1] > intervals[i][1])
    39. intervals[i][1] = intervals[i - 1][1];
    40. } else {
    41. res.add(intervals[i - 1]);
    42. }
    43. if (i == len - 1) res.add(intervals[i]);
    44. }
    45. return res.toArray(new int[0][0]);
    46. }

    合并区间