区间合并Java

区间合并是一种常见的算法问题,通常出现在处理时间序列数据、任务调度等场景中。在Java中,我们可以通过一些简单的步骤来实现区间合并。本文将通过代码示例来解释区间合并的基本概念和实现方法。

问题描述

给定一组区间,每个区间由一个开始和结束时间组成。我们需要合并所有重叠的区间,并将它们表示为一个新的区间列表。

算法流程

  1. 将所有区间按照开始时间进行排序。
  2. 从排序后的区间列表中,选择第一个区间作为初始合并区间。
  3. 遍历剩余的区间,对于每个区间:
    • 如果当前区间的开始时间小于或等于合并区间的结束时间,则将当前区间与合并区间合并。
    • 否则,将合并区间添加到结果列表中,并用当前区间作为新的合并区间。

代码示例

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中实现区间合并的具体步骤和方法。希望本文能够帮助读者更好地理解和掌握区间合并算法。