Skip to content

Commit e7bba86

Browse files
committed
56.合并区间
1 parent f846633 commit e7bba86

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
53. 最大子数组和
2525
54. 螺旋矩阵
2626
55. 跳跃游戏
27+
56. 合并区间
2728
62. 不同路径
2829
64. 最小路径和
2930
69. x 的平方根

leetcode_Java/Solution0056.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// 56. 合并区间
2+
3+
4+
/*
5+
遍历区间,加入新区间 或 更新结果数组最后一个区间的右端点值成为新合并区间
6+
1、先将列表中的区间按照左端点升序排序
7+
2、遍历二维数组
8+
1)第一个区间则直接加入结果数组
9+
2)如果 结果数组最后一个区间的右端点 小于 当前区间左端点,说明没有重合,当前区间加入结果数组
10+
3)如果 结果数组最后一个区间的右端点 大于等于 当前区间左端点,说明有重合,则更新结果数组最后一个区间右端点的值,该值为两右端点取较大者
11+
3、列表转数组后返回
12+
13+
intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,3]]
14+
15+
intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,6]]
16+
17+
intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,6],[8,10]]
18+
19+
intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,6],[8,10],[15,18]]
20+
21+
*/
22+
class Solution {
23+
public int[][] merge(int[][] intervals) {
24+
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
25+
List<int[]> res = new ArrayList<>();
26+
for (int[] interval : intervals) {
27+
int size = res.size();
28+
if (size == 0 || res.get(size - 1)[1] < interval[0]) {
29+
res.add(new int[]{interval[0], interval[1]});
30+
} else {
31+
res.get(size - 1)[1] = Math.max(res.get(size - 1)[1], interval[1]);
32+
}
33+
}
34+
return res.toArray(new int[res.size()][]);
35+
}
36+
}
37+
38+
39+
/*
40+
逻辑同上
41+
*/
42+
class Solution {
43+
public int[][] merge(int[][] intervals) {
44+
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
45+
int[][] res = new int[intervals.length][2];
46+
int index = -1;
47+
for (int[] interval : intervals) {
48+
if (index == -1 || interval[0] > res[index][1]) {
49+
res[++index] = interval;
50+
} else {
51+
res[index][1] = Math.max(res[index][1], interval[1]);
52+
}
53+
}
54+
return Arrays.copyOf(res, index + 1);
55+
}
56+
}
57+
58+
59+
/*
60+
先遍历多个区间,更新区间右端点值,找到一个合并区间后加入结果数组
61+
*/
62+
class Solution {
63+
public int[][] merge(int[][] intervals) {
64+
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
65+
List<int[]> res = new ArrayList<>();
66+
int n = intervals.length;
67+
for (int i = 0; i < n; i++) {
68+
int left = intervals[i][0];
69+
int right = intervals[i][1];
70+
while (i < n && right >= intervals[i][0]) {
71+
right = Math.max(right, intervals[i][1]);
72+
i++;
73+
}
74+
i--;
75+
res.add(new int[]{left, right});
76+
}
77+
return res.toArray(new int[res.size()][]);
78+
}
79+
}

0 commit comments

Comments
 (0)