思路:典型的区间合并问题,笔试中也经常遇到,可以将区间先进行排序,然后按顺序对能合并的区间进行合并即可,需要注意的是最后一个区间,如果不能和之前的区间进行合并,最后一个区间就会被遗漏,这里的做法是添加一个辅助结尾区间,intervals.add(new Interval(Integer.MAX_VALUE, Integer.MAX_VALUE));这样最后一个有效区间就能进行处理了。
class Interval {
int start;
int end;
Interval() {
start = 0;
end = 0;
}
Interval(int s, int e) {
start = s;
end = e;
}
@Override
public String toString() {
return "Interval [start=" + start + ", end=" + end + "]";
}
}
public class MergeIntervals {
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));
System.out.println(merge(intervals));
}
public static List<Interval> merge(List<Interval> intervals) {
List<Interval> list = new ArrayList<>();
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 if(o1.end > o2.end)
return 1;
else if(o1.end < o2.end)
return -1;
else
return 0;
}
});
intervals.add(new Interval(Integer.MAX_VALUE, Integer.MAX_VALUE));
int start = intervals.get(0).start;
int end = intervals.get(0).end;
Iterator<Interval> it = intervals.iterator();
while(it.hasNext()){
Interval tmp = it.next();
if(tmp.start>=start&&tmp.start<=end)
end=Math.max(end, tmp.end);
else
{
list.add(new Interval(start, end));
start=tmp.start;
end=tmp.end;
}
}
return list;
}
}
输出: