56. 合并区间
1. 题目描述
题目链接
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
2. 题目分析
如果两个区间有重合的部分,则可以将两个区间进行合并。
合并时需要注意的一点是,如果两个区间,如[2,5],[3,4],两个区间是存在重合的部分,但合并时,不是简单的取第一个区间的start值,和第二区间的end值,合并成新的区间,即[2,4],这明显把两个区间能表示的范围缩小了。
3. 解决思路
- 暴力方法:每次查找是否存在与当前区间有重合的区间,遍历整个集合,比较是否有符合条件的区间,时间复杂度为O(n2);
- 高效率的方法:首先将这些乱序的集合进行排序,这里有人会问区间之间要怎么排序?这里涉及到java的高级的集合工具类,自己定义实现一个比较类IntervalComparator,只要实现Comparator接口就可以了。最后调用Collections.sort()(Collections说明这是对集合对象的工具类,如list、set等)方法进行区间排序。
4. 代码实现(java)
package com.algorithm.leetcode.array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by 凌 on 2018/12/8.
* 描述:合并区间
*/
public class MergeInterval {
public static void main(String[] args) {
List<Interval> list = new ArrayList<>();
Interval interval = new Interval(1,3);
list.add(interval);
interval = new Interval(2,6);
list.add(interval);
interval = new Interval(15,18);
list.add(interval);
interval = new Interval(8,10);
list.add(interval);
// interval = new Interval(5,10);
// list.add(interval);
List<Interval> result = merge(list);
for (int i = 0; i < result.size(); i++) {
System.out.printf("["+result.get(i).start + "," + result.get(i).end + "],");
}
System.out.println("");
}
public static List<Interval> merge(List<Interval> intervals) {
if (intervals == null || intervals.size() <= 1){
return intervals;
}
List<Interval> list = new ArrayList<>();
//对集合排序
Collections.sort(intervals,new IntervalComparator());
int beforeIndex= -1;
for (Interval interval : intervals){
if (list.isEmpty() || interval.start > list.get(beforeIndex).end){
list.add(interval);
beforeIndex++;
}else{
if (list.get(beforeIndex).end >= interval.start && list.get(beforeIndex).end < interval.start){
list.get(beforeIndex).end = interval.end;
}
}
}
return list;
}
}
class Interval {
int start;
int end;
Interval() { start = 0; end = 0; }
Interval(int s, int e) { start = s; end = e; }
}
/**
* 自己定义实现一个比较器
*/
class IntervalComparator implements Comparator<Interval> {
@Override
public int compare(Interval interval1,Interval interval2) {
return interval1.start - interval2.start;
}
}