区间合并Java
区间合并是一种常见的算法问题,通常出现在处理时间序列数据、任务调度等场景中。在Java中,我们可以通过一些简单的步骤来实现区间合并。本文将通过代码示例来解释区间合并的基本概念和实现方法。
问题描述
给定一组区间,每个区间由一个开始和结束时间组成。我们需要合并所有重叠的区间,并将它们表示为一个新的区间列表。
算法流程
- 将所有区间按照开始时间进行排序。
- 从排序后的区间列表中,选择第一个区间作为初始合并区间。
- 遍历剩余的区间,对于每个区间:
- 如果当前区间的开始时间小于或等于合并区间的结束时间,则将当前区间与合并区间合并。
- 否则,将合并区间添加到结果列表中,并用当前区间作为新的合并区间。
代码示例
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class IntervalMerge {
public static List<Interval> merge(List<Interval> intervals) {
if (intervals.size() <= 1) {
return intervals;
}
// Step 1: Sort intervals by start time
Collections.sort(intervals, Comparator.comparingInt(a -> a.start));
List<Interval> mergedIntervals = new ArrayList<>();
Interval currentInterval = intervals.get(0);
for (int i = 1; i < intervals.size(); i++) {
Interval nextInterval = intervals.get(i);
// Step 3: Merge intervals if they overlap
if (nextInterval.start <= currentInterval.end) {
currentInterval.end = Math.max(currentInterval.end, nextInterval.end);
} else {
mergedIntervals.add(currentInterval);
currentInterval = nextInterval;
}
}
// Add the last merged interval
mergedIntervals.add(currentInterval);
return mergedIntervals;
}
public static void main(String[] args) {
List<Interval> intervals = new ArrayList<>();
intervals.add(new Interval(1, 3));
intervals.add(new Interval(2, 6));
intervals.add(new Interval(8, 10));
intervals.add(new Interval(15, 18));
List<Interval> mergedIntervals = merge(intervals);
for (Interval interval : mergedIntervals) {
System.out.println("[" + interval.start + ", " + interval.end + "]");
}
}
static class Interval {
int start;
int end;
Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
}
关系图
以下是区间合并算法中涉及的实体及其关系:
erDiagram
INTERVAL ||--o|{ MERGED_INTERVAL : contains
INTERVAL {
int start
int end
}
MERGED_INTERVAL {
int start
int end
}
结论
区间合并是一个简单但实用的算法,可以应用于各种需要处理时间序列数据的场景。通过上述代码示例,我们可以看到Java中实现区间合并的具体步骤和方法。希望本文能够帮助读者更好地理解和掌握区间合并算法。