Merge Intervals

本文介绍了一种区间合并算法,用于合并重叠的区间集合,并通过排序和遍历的方式实现了高效的合并过程。时间复杂度为O(nlogn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

题目中给定了一个interval集合,要求我们将集合中的interval合并,合并之后的interval是按照升序排列的。我们可以先将interval排序先按照interval的第一个元素,如果第一个元素相等就按照第二个元素。排序的时候我们定义一个比较器comparator。排序之后,从第二个interval开始,如果第二个interval的第一个元素等于或小于第一个interval的第二个元素,那么就将intervals[1].end = Math.max(intervals[2].end, intervals[1].end)。如果没有重叠,直接打入到结果集中。时间复杂度为O(nlogn)。代码如下:

/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public List<Interval> merge(List<Interval> intervals) {
List<Interval> list = new ArrayList<Interval>();
if(intervals == null || intervals.size() == 0) return list;
Collections.sort(intervals, new Comparator<Interval>() {
@Override
public int compare(Interval i1, Interval i2) {
if(i1.start == i2.start)
return i1.end - i2.end;
return i1.start - i2.start;
}
});
list.add(intervals.get(0));
for(int i = 0; i < intervals.size(); i++) {
if(list.get(list.size() - 1).end >= intervals.get(i).start) {
list.get(list.size() - 1).end = Math.max(list.get(list.size() - 1).end, intervals.get(i).end);
} else {
list.add(intervals.get(i));
}
}
return list;
}
}
### 合并重叠区间的Python方法 在处理区间数据时,合并重叠区间是一个常见的需求。以下是通过Python实现这一功能的具体方法。 #### 方法概述 为了有效地合并重叠区间,可以采用排序和遍历的方式。首先按照区间的起始位置对输入列表进行排序,随后逐一比较当前区间与下一个区间的结束位置来判断是否存在重叠。如果存在,则更新为一个新的更大的区间;否则将当前区间加入结果集[^2]。 #### 实现代码 下面提供了一段完整的Python代码用于演示如何合并一组给定的重叠区间: ```python def merge_intervals(intervals): if not intervals: return [] # 对区间按起点升序排列 intervals.sort(key=lambda x: x[0]) merged = [intervals[0]] for current in intervals[1:]: last_merged = merged[-1] # 如果当前区间的起点小于等于上一区间的终点,则有交集 if current[0] <= last_merged[1]: # 更新最后一个合并区间的终点为两者中的较大者 last_merged[1] = max(last_merged[1], current[1]) else: # 当前区间无交集,直接添加到结果集中 merged.append(current) return merged # 测试用例 test_intervals = [[1, 3], [2, 6], [8, 10], [15, 18]] result = merge_intervals(test_intervals) print(result) # 输出应为[[1, 6], [8, 10], [15, 18]] ``` 上述函数`merge_intervals()`接收一个二维数组作为参数,其中每一维表示一个区间[start,end]。它返回的是经过合并后的最小数量不相交区间集合。 #### 结果解释 对于测试用例 `[[1, 3], [2, 6], [8, 10], [15, 18]]` ,最终输出的结果是 `[[1, 6], [8, 10], [15, 18]]` 。这表明原序列中 `[1, 3]` 和 `[2, 6]` 被成功合并成了单个较大的区间 `[1, 6]`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值