题目

Given a collection of intervals, merge all overlapping intervals.

Example 1:

  1. Input: [[1,3],[2,6],[8,10],[15,18]]
  2. Output: [[1,6],[8,10],[15,18]]
  3. Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Example 2:

  1. Input: [[1,4],[4,5]]
  2. Output: [[1,5]]
  3. Explanation: Intervals [1,4] and [4,5] are considered overlapping.

NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.


题意

将给定数组中所有互相重叠的区间合并为一个大区间。

思路

将区间按照左端点值排序后进行处理。


代码实现

Java

  1. class Solution {
  2. public int[][] merge(int[][] intervals) {
  3. if (intervals.length == 0) {
  4. return new int[][]{};
  5. }
  6. Arrays.sort(intervals, new Comparator<int[]>() {
  7. @Override
  8. public int compare(int[] a, int[] b) {
  9. return a[0] - b[0];
  10. }
  11. });
  12. List<int[]> list = new ArrayList<>();
  13. int left = intervals[0][0], right = intervals[0][1];
  14. for (int i = 1; i < intervals.length; i++) {
  15. int[] interval = intervals[i];
  16. if (left <= interval[1] && right >= interval[0]) {
  17. left = Math.min(left, interval[0]);
  18. right = Math.max(right, interval[1]);
  19. } else {
  20. list.add(new int[]{left, right});
  21. left = interval[0];
  22. right = interval[1];
  23. }
  24. }
  25. list.add(new int[]{left, right});
  26. return list.toArray(new int[list.size()][]);
  27. }
  28. }

JavaScript

  1. var merge = function(intervals) {
  2. let ans = [];
  3. if (intervals.length == 0) {
  4. return ans;
  5. }
  6. intervals.sort((a, b) => a[0] - b[0]);
  7. let left = intervals[0][0], right = intervals[0][1];
  8. for (let interval of intervals) {
  9. if (left <= interval[1] && right >= interval[0]) {
  10. left = Math.min(left, interval[0]);
  11. right = Math.max(right, interval[1]);
  12. } else {
  13. ans.push([left, right]);
  14. left = interval[0];
  15. right = interval[1];
  16. }
  17. }
  18. ans.push([left, right]);
  19. return ans;
  20. };