56. 合并区间
- 题号:56
- 来源:LeetCode
- 难度:中等
- 标签:
排序区间数组 - 语言:TypeScript · Python · Java
- 解法:3 个
- 作者:lmliheng
- 最近更新:2026-09-29
TypeScript
TypeScript · O(n*log n) 时间 · O(n) 空间 · 更新于 2026-09-27
按起点排序后逐个合并重叠区间
typescript
/**
* @difficulty medium
* @tags 排序,区间,数组
* @time O(n*log n)
* @space O(n)
* @note 按起点排序后逐个合并重叠区间
* @56. 合并区间
*
* 以数组 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].
*/
export function merge(intervals: number[][]) {
let sortIntervals = intervals.sort((a, b) => a[0] - b[0])
let res: number[][] = []
sortIntervals.forEach((item, index) => {
if (index === 0) {
res.push(item)
}
if (res[res.length - 1][1] < item[0]) {
res.push(item)
}
if (item[0] <= res[res.length - 1][1]) {
res[res.length - 1][1] = Math.max(res[res.length - 1][1], item[1])
}
})
return res
};Python
Python · O(n log n) 时间 · O(n) 空间 · 更新于 2026-09-29
按左端点排序后逐个合并重叠区间
python
"""
@difficulty medium
@tags 排序,区间
@time O(n log n)
@space O(n)
@note 按左端点排序后逐个合并重叠区间
合并区间
lc 56
"""
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key=lambda x:x[0])
res=[]
for index,interval in enumerate(intervals):
if index==0:
res.append(interval)
if interval[0]>res[len(res)-1][1]:
res.append(interval)
else:
res[len(res)-1][1]=max(interval[1],res[len(res)-1][1])
return res源码:python/leetcode/hot100/14.py
Java
Java · O(n log n) 时间 · O(n) 空间 · 更新于 2026-09-27
先按左端点排序,再顺序合并与末尾区间重叠的部分
java
/**
* @lc 56
* @title 合并区间
* @difficulty medium
* @tags 排序,区间,数组
* @time O(n log n)
* @space O(n)
* @note 先按左端点排序,再顺序合并与末尾区间重叠的部分
*/
public class MergeIntervals {
public int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return new int[0][]; // 返回空二维数组
}
List<int[]> res = new ArrayList<>();
// 后续改成lamada
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
res.add(intervals[0]);
// jdk17 ArrayList无getLast()
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] > res.get(res.size() - 1)[1]) {
res.add(intervals[i]);
} else {
int[] newInterval = { res.get(res.size() - 1)[0],
Math.max(res.get(res.size() - 1)[1], intervals[i][1]) };
res.set(res.size() - 1, newInterval);
}
}
return res.toArray(new int[res.size()][]);
}
}源码:Java/src/main/java/com/algorithm/leetcode/MergeIntervals.java
在 GitHub 上查看题目所在目录:lmliheng/algorithm