题目
给出一个区间的集合,请合并所有重叠的区间。
示例 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 P56_MergeIntervals {
public int[][] merge(int[][] intervals) {
if(intervals==null||intervals.length==0){
return new int[][]{};
}
//用向量暂存变长的数组
Vector vector = new Vector();
//对区间按左边界从低到高排序
sort(intervals);
int left = intervals[0][0];
int right = intervals[0][1];
//遍历合并区间
for(int i = 1;i<intervals.length;i++){
if(intervals[i][0]>=left&&intervals[i][0]<=right){
right = right>intervals[i][1]?right:intervals[i][1];
}else {
vector.addElement(new int[]{left,right});
left = intervals[i][0];
right = intervals[i][1];
}
}
vector.addElement(new int[]{left,right});
int[][] r = new int[vector.size()][2];
//向量转化成数组
vector.copyInto(r);
return r;
}
//快速排序(按照区间左值排序)
private void sort(int[][] arr){
quickSort(arr,0,arr.length-1);
}
private void quickSort(int[][] arr,int l,int r){
if(l < r){
int index = partition(arr,l,r);
quickSort(arr,l,index - 1);
quickSort(arr,index+1,r);
}
}
private int partition(int[][] arr,int l,int r){
//设定基准值p
int p = l;//一般来说基准值可以任意取
int index = p + 1;
for(int i = index;i <= r;i++){
if(arr[i][0] < arr[p][0]){
swap(arr,i,index);
index++;
}
}
swap(arr,p,index-1);
return index -1;
}
private void swap(int[][] arr,int i,int j){
int tmp1 = arr[i][0];
int tmp2 = arr[i][1];
arr[i][0] = arr[j][0];
arr[i][1] = arr[j][1];
arr[j][0] = tmp1;
arr[j][1] = tmp2;
}
}
思路:
- 用向量暂存变长的数组
- 对区间按左边界从低到高排序(快速排序)
- 遍历各个区间,对重叠部分合并,重叠判定:当前遍历的区间的左边界,落在left和right之间
彩蛋
啥也不说了,明年继续加油吧~