题目:
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
题目要求对区间进行融合,拿到题目后有两个思路,一是创建一个足够大的boolean数组,遍历所有区间,把区间中的元素置位true,然后再遍历一次这个数组,得到融合后的区间。但是这种方法对空间复杂度太高,如果有个区间的end是max_int,那空间的开销太大了,而且遍历1到max_int的时间复杂度也太高,pass!
另外一种思路是先对区间按start进行排序,这样就方便了融合的处理
public static List<Interval> merge(List<Interval> intervals) {
if(intervals.size() <= 1) return intervals;
List<Interval> ret = new ArrayList<Interval>();
Interval[] A = new Interval[intervals.size()];
intervals.toArray(A);
quickSort(A, 0, A.length-1);
Interval tmp = A[0];
for(int i=1;i<A.length;i++){
if(tmp.end >= A[i].start)
tmp.end = tmp.end>A[i].end?tmp.end:A[i].end;
else{
ret.add(tmp);
tmp = A[i];
}
}
ret.add(tmp);
return ret;
}
public static void quickSort(Interval[] A, int low, int high){
if(low < high){
int index = partition(A, low, high);
quickSort(A, low, index-1);
quickSort(A, index+1, high);
}
}
private static int partition(Interval[] A, int low, int high){
Interval pivot = A[low];
while(low < high){
while(low<high && A[high].start > pivot.start) high--;
A[low] = A[high];
while(low<high && A[low].start <= pivot.start) low++;
A[high] = A[low];
}
A[low] = pivot;
return low;
}