forked from haobinaa/DataStructure-DesignPattern
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMergeIntervals.java
57 lines (53 loc) · 1.58 KB
/
MergeIntervals.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.haobin.leetcode.arrays;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @Author HaoBin
* @Create 2020/2/14 10:36
* @Description: 合并区间
*
* 给出一个区间的集合,请合并所有重叠的区间。
*
* 示例 1:
*
* 输入: [[1,3],[2,6],[8,10],[15,18]]
* 输出: [[1,6],[8,10],[15,18]]
* 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
* 示例 2:
*
* 输入: [[1,4],[4,5]]
* 输出: [[1,5]]
* 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
*
**/
public class MergeIntervals {
/**
* 1. 按首位置进行排序
* 2. 当 a[1] > b[0] , 则表名两个区间重叠
* 3. 左边区间是 a[0], 右边区间是 max{a[1], b[1]}
*/
public int[][] merge(int[][] intervals) {
List<int[]> ans = new ArrayList<>();
if (intervals.length == 0 || intervals == null) {
return ans.toArray(new int[0][]);
}
Arrays.sort(intervals, (a, b) -> {return a[0] - b[0];});
int i = 0;
while (i < intervals.length) {
int left = intervals[i][0];
int right = intervals[i][1];
// 判断是否含有重叠区间
while (i < intervals.length-1 && intervals[i+1][0] <= right) {
// 下一组数属于重叠区间
i++;
// 重叠区间的右边界
right = Math.max(right, intervals[i][1]);
}
ans.add(new int[]{left, right});
i++;
}
return ans.toArray(new int[0][]);
}
}