Skip to content

Commit a6d834d

Browse files
committed
二刷56
1 parent c8f037d commit a6d834d

File tree

3 files changed

+84
-18
lines changed

3 files changed

+84
-18
lines changed

docs/0056-merge-intervals.adoc

+44-18
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,61 @@
11
[#0056-merge-intervals]
2-
= 56. Merge Intervals
2+
= 56. 合并区间
33

4-
{leetcode}/problems/merge-intervals/[LeetCode - Merge Intervals^]
4+
https://leetcode.cn/problems/merge-intervals/[LeetCode - 56. 合并区间 ^]
55

6-
Given a collection of intervals, merge all overlapping intervals.
6+
以数组 `intervals` 表示若干个区间的集合,其中单个区间为 `+intervals[i] = [start+`~`+i+`~`+, end+`~`+i+`~`+]+`。请你合并所有重叠的区间,并返回 _一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间_
77

8-
*Example 1:*
98

10-
[subs="verbatim,quotes,macros"]
11-
----
12-
*Input:* [[1,3],[2,6],[8,10],[15,18]]
13-
*Output:* [[1,6],[8,10],[15,18]]
14-
*Explanation:* Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
9+
*示例 1:*
1510

16-
----
11+
....
12+
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
13+
输出:[[1,6],[8,10],[15,18]]
14+
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
15+
....
1716

18-
*Example 2:*
17+
*示例 2:*
18+
19+
....
20+
输入:intervals = [[1,4],[4,5]]
21+
输出:[[1,5]]
22+
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
23+
....
24+
25+
26+
*提示:*
27+
28+
* `+1 <= intervals.length <= 10+`^`+4+`^
29+
* `+intervals[i].length == 2+`
30+
* `+0 <= start+`~`+i+`~`+<= end+`~`+i+`~`+<= 10+`^`+4+`^
1931
20-
[subs="verbatim,quotes,macros"]
21-
----
22-
*Input:* [[1,4],[4,5]]
23-
*Output:* [[1,5]]
24-
*Explanation:* Intervals [1,4] and [4,5] are considered overlapping.
25-
----
2632
27-
*NOTE:* input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
33+
34+
== 思路分析
2835

2936

3037
[[src-0056]]
38+
[tabs]
39+
====
40+
一刷::
41+
+
42+
--
3143
[{java_src_attr}]
3244
----
3345
include::{sourcedir}/_0056_MergeIntervals.java[tag=answer]
3446
----
47+
--
48+
49+
二刷::
50+
+
51+
--
52+
[{java_src_attr}]
53+
----
54+
include::{sourcedir}/_0056_MergeIntervals_2.java[tag=answer]
55+
----
56+
--
57+
====
58+
59+
60+
== 参考资料
3561

logbook/202503.adoc

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ endif::[]
2525
|{doc_base_url}/0033-search-in-rotated-sorted-array.adoc[题解]
2626
|⭕️ 重点去处理有序部分,在有序部分内查找不到,则去另外一部分去查找。
2727

28+
|{counter:codes2503}
29+
|{leetcode_base_url}/merge-intervals/[56. Merge Intervals^]
30+
|{doc_base_url}/0056-merge-intervals.adoc[题解]
31+
|✅ 对区间进行排序,然后快慢指针在当前数组上对其进行合并。
32+
2833
|===
2934

3035
截止目前,本轮练习一共完成 {codes2503} 道题。
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.Arrays;
4+
import java.util.Comparator;
5+
6+
public class _0056_MergeIntervals_2 {
7+
// tag::answer[]
8+
9+
/**
10+
* @author D瓜哥 · https://www.diguage.com
11+
* @since 2025-03-05 17:14:39
12+
*/
13+
public int[][] merge(int[][] intervals) {
14+
// 对待合并区间进行排序,首先按照起点排序,然后按终点排序
15+
// 排序后,可以保证起点有序;在起点相等时,终点有序。
16+
Arrays.sort(intervals, Comparator.comparingInt((int[] o) -> o[0])
17+
.thenComparingInt(o -> o[1]));
18+
int merged = 0, curr = 0;
19+
while (merged < intervals.length && curr < intervals.length) {
20+
if (intervals[curr][0] <= intervals[merged][1]) {
21+
// 如果当前区间起点小于等于合并后区间的终点,那么直接合并到已经合并的区间里
22+
intervals[merged][1] = Math.max(intervals[merged][1], intervals[curr][1]);
23+
} else {
24+
// 如果当前区间起点大于合并后区间的终点,那么直接开启新的合并区间
25+
merged++;
26+
intervals[merged] = intervals[curr];
27+
}
28+
// 每次合并,当前区间都要向前走一下。
29+
curr++;
30+
}
31+
return Arrays.copyOf(intervals, merged + 1);
32+
}
33+
34+
// end::answer[]
35+
}

0 commit comments

Comments
 (0)