一、题目描述
描述:
给出一组区间,请合并所有重叠的区间。请保证合并后的区间按区间起点升序排列。
示例1:
输入:
[[10,30],[20,60],[80,100],[150,180]]
输出:
[[10,60],[80,100],[150,180]]
示例2:
输入:
[[0,10],[10,20]]
输出:
[[0,20]]
二、题解
1、分析
核心思想:如果两个区间存在交集(即一个区间的开始值小于或等于另一个区间的结束值),则它们可以合并成一个新的区间,这个新区间的开始值为原两个区间开始值中的较小者,结束值为原两个区间结束值中的较大者。通过遍历所有区间,我们可以得到最终的合并结果。
解题步骤:
(1)检查输入的区间列表是否为空或只包含一个区间,如果是,则直接返回原列表,因为无需合并。
(2)对区间列表按开始值进行排序,以便后续合并操作。
(3)初始化一个空列表用于存储合并后的区间,并设置当前区间为排序后的第一个区间
(4)遍历排序后的区间列表,从第二个区间开始
- 如果当前区间的结束值大于等于下一个区间的开始值,说明存在交集,更新当前区间的结束值为两者结束值中的较大者。
- 如果不存在交集,则将当前区间添加到合并后的列表,并更新当前区间为下一个区间。
(5)将最后一个区间添加到合并后的列表。
(6)返回合并后的区间列表。
2、代码
// NC37 合并区间
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
class Interval {
int start;
int end;
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
public class Main {
// 合并区间的方法
private static List<Interval> merge(List<Interval> intervals) {
// 如果区间列表为空或只包含一个区间,直接返回原列表
if (intervals == null || intervals.size() <= 1) {
return intervals;
}
// 对区间列表按开始值进行排序
intervals.sort(Comparator.comparingInt(interval -> interval.start));
// 初始化合并后的区间列表
List<Interval> merged = new ArrayList<>();
// 设置当前区间为排序后的第一个区间
Interval curInterval = intervals.get(0);
// 遍历排序后的区间列表
for (int i = 1; i < intervals.size(); i++) {
// 获取下一个区间
Interval nextInterval = intervals.get(i);
// 如果存在交集
if (nextInterval.start <= curInterval.end) {
// 更新当前区间的结束值为两者结束值中的较大者
curInterval.end = Math.max(curInterval.end, nextInterval.end);
} else {
// 不存在交集,将当前区间添加到合并后的列表
merged.add(curInterval);
// 更新当前区间为下一个区间
curInterval = nextInterval;
}
}
// 将最后一个区间添加到合并后的列表
merged.add(curInterval);
// 返回合并后的区间列表
return merged;
}
public static void main(String[] args) {
// 创建一个区间列表
List<Interval> intervals = new ArrayList<>();
// 添加区间到列表
intervals.add(new Interval(10, 30));
intervals.add(new Interval(20, 60));
intervals.add(new Interval(80, 100));
intervals.add(new Interval(150, 180));
// 调用合并区间的方法
List<Interval> mergedIntervals = merge(intervals);
// 输出合并后的区间
for (Interval interval : mergedIntervals) {
System.out.print("[" + interval.start + "," + interval.end + "]");
}
}
}