给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
题目分析:
要合并区间,则想到比较区间的边界元素,然后按大小合并;
首先将各个区间按第一个元素的大小排序,然后用前一个区间的最后一个元素去跟后一个区间的第一个和最后一个元素比较:
- 前一个区间的最后一个元素大于后一个区间的第一个元素,小于后一个区间的最后一个元素;则合并这两个区间。
- 前一个区间的最后一个元素大于后一个区间的最后一个元素;则去除后一个区间。
- 前一个区间的最后一个元素小于后一个区间的第一个元素;则不合并,不处理。
将区间排序可以参照这篇博客!
代码实现:
public class A2 { public static class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } public List<Interval> merge(List<Interval> intervals) { Collections.sort(intervals, new Comparator<Interval>() { @Override public int compare(Interval o1, Interval o2) { if (o1.start > o2.start) return 1; else if (o1.start < o2.start) return -1; else return 0; } }); int i = 0; while (i < intervals.size()) { if (i != intervals.size() - 1) { if (intervals.get(i).end >= intervals.get(i + 1).start && intervals.get(i).end <= intervals.get(i + 1).end) { int tempStart = intervals.get(i).start; int tempEnd = intervals.get(i + 1).end; intervals.remove(i); intervals.get(i).start = tempStart; intervals.get(i).end = tempEnd; } else if (intervals.get(i).end < intervals.get(i + 1).start) { i++; } else if (intervals.get(i).end > intervals.get(i + 1).end) { intervals.remove(i + 1); } } else { i++; } } return intervals; }
主函数:
public static void main(String[] args) { A2 a = new A2(); Interval interval1 = new Interval(2,3); Interval interval2 = new Interval(4,5); Interval interval3 = new Interval(6,7); Interval interval4 = new Interval(8,9); Interval interval5 = new Interval(1,10); List<Interval> list = new LinkedList<>(); list.add(interval1); list.add(interval2); list.add(interval3); list.add(interval4); list.add(interval5); List<Interval> res = a.merge(list); for (int i = 0; i < res.size(); i++) { System.out.println(res.get(i).start + "," + res.get(i).end); } }
运行结果:
1,10