题目描述

原题链接
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

个人解法

Javascript

  1. /*
  2. * @lc app=leetcode.cn id=56 lang=javascript
  3. *
  4. * [56] 合并区间
  5. */
  6. // @lc code=start
  7. /**
  8. * @param {number[][]} intervals
  9. * @return {number[][]}
  10. */
  11. var merge = function (intervals) {
  12. const length = intervals.length;
  13. if (length === 1) {
  14. return intervals;
  15. }
  16. intervals.sort((a, b) => {
  17. return a[0] - b[0];
  18. })
  19. const result = [intervals[0]];
  20. for (let i = 1; i < length; i++) {
  21. const len = result.length;
  22. let index = - 1;
  23. if (result[len - 1][1] < intervals[i][0]) {
  24. result.push(intervals[i]);
  25. }
  26. else {
  27. for (let j = len - 1; j >= 0; j--) {
  28. if (result[j][1] >= intervals[i][0]) {
  29. index = j;
  30. break;
  31. }
  32. }
  33. result[index][1] = Math.max(result[index][1], intervals[i][1]);
  34. }
  35. }
  36. return result;
  37. };
  38. // @lc code=end

Java

  1. class Solution {
  2. public int[][] merge(int[][] intervals) {
  3. int len= intervals.length,flag=0,f=0;
  4. int[] temp=new int[]{};
  5. for (int i=0;i<len-1;i++){
  6. for (int j=0;j<len-1;j++){
  7. if (intervals[j][0]>intervals[j+1][0]){
  8. temp=intervals[j];
  9. intervals[j]=intervals[j+1];
  10. intervals[j+1]=temp;
  11. flag=1;
  12. }
  13. }
  14. if (flag==1){
  15. flag=0;
  16. }else {
  17. break;
  18. }
  19. }
  20. List<int[]> list=new ArrayList<>();
  21. int left,right=-1,nowright;
  22. for (int i=0;i<len-1;i++){
  23. left=intervals[i][0];
  24. nowright=intervals[i][1];
  25. for (int j=i+1;j<len;j++){
  26. if (intervals[j][0]<=nowright){
  27. right=Math.max(intervals[j][1],nowright);
  28. nowright=right;
  29. flag=j;
  30. }else {
  31. break;
  32. }
  33. }
  34. if (right!=-1){
  35. int[] nums=new int[]{left,right};
  36. list.add(nums);
  37. right=-1;
  38. i=flag;
  39. if (i==len-1){
  40. f=1;
  41. }
  42. }else {
  43. list.add(intervals[i]);
  44. }
  45. }
  46. if (f==0){
  47. list.add(intervals[len-1]);
  48. }
  49. int size= list.size(),index=0;
  50. int[][] result=new int[size][];
  51. for (int[] ints:list){
  52. result[index++]=ints;
  53. }
  54. return result;
  55. }
  56. }

其他解法

Java

优化之后

  1. class Solution {
  2. public int[][] merge(int[][] intervals) {
  3. if (intervals.length == 0) {
  4. return new int[0][2];
  5. }
  6. Arrays.sort(intervals, new Comparator<int[]>() {
  7. public int compare(int[] interval1, int[] interval2) {
  8. return interval1[0] - interval2[0];
  9. }
  10. });
  11. List<int[]> merged = new ArrayList<int[]>();
  12. for (int i = 0; i < intervals.length; ++i) {
  13. int L = intervals[i][0], R = intervals[i][1];
  14. if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {
  15. merged.add(new int[]{L, R});
  16. } else {
  17. merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);
  18. }
  19. }
  20. return merged.toArray(new int[merged.size()][]);
  21. }
  22. }

Javascript