给出一个区间的集合, 请合并所有重叠的区间。
示例:
给出 [1,3],[2,6],[8,10],[15,18],
返回 [1,6],[8,10],[15,18].
已知:
static class Interval {
int start;
int end;
Interval() { start = 0; end = 0; }
Interval(int s, int e) { start = s; end = e; }
@Override
public String toString() {
// TODO Auto-generated method stub
return start+"";
}
}
求:
public static ArrayList<Interval> quicksort(ArrayList<Interval> list){
// 开始你的表演
}
使用java封装的sort()方法解答:
public static List<Interval> merge(List<Interval> intervals) {
if(intervals.size()<2){
return intervals;
}
List<Interval> mList=new ArrayList();
intervals.sort(new Comparator<Interval>() {
@Override
public int compare(Interval arg0, Interval arg1) {
// TODO Auto-generated method stub
System.out.println("arg0="+arg0.start+",arg1="+arg1.start);
return arg0.start-arg1.start;
}
});
Interval l1=intervals.get(0);
mList.add(l1);
for(int i=1; i<intervals.size(); i++){
Interval l2=intervals.get(i);
if(l1.end>=l2.start){
l1.end=Math.max(l1.end, l2.end);
mList.set(mList.size()-1, l1);
}else{
mList.add(l2);
l1=l2;
}
}
return mList;
}
继续看:
其实这是一道快速排序算法,如果不用sort方法,我们可以自己写出来。
public static ArrayList<Interval> quicksort(ArrayList<Interval> list){
if(list.size()<2){
return list;
}
Interval pivot=list.get(0);
ArrayList<Interval> mList=new ArrayList<>();
ArrayList<Interval> less=new ArrayList<>();
ArrayList<Interval> greater=new ArrayList<>();
for(int i=1; i<list.size(); i++){
if(list.get(i).start>pivot.start){
greater.add(list.get(i));
}else {
less.add(list.get(i));
}
}
mList.addAll(quicksort(less));
mList.add(pivot);
mList.addAll(quicksort(greater));
return mList;
}
快速排序内部使用递归,只需要执行三步,即可:
- 选择基准值
- 将数组分成领个子数组,小于基准值的数组放到基准值左边,大于基准值的数组放到基准值右边
- 重复前面两步,对这两个自数据进行快速排序
在平均情况下,快速排序的运行时间为O(nlog(n));在最糟糕情况,这种算法的运行时间为O(n^2).