package leetcode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class p56 {
public static void main(String[] args) {
}
/**
* 11.20-11.45
* 思路1:根据每个数组中的开始进行排序,之后遍历一次数组,前一个数组的结束大于等于后一个数组的开始,那么就将这两个数组合并
* 作为一个新的数组,若没有,则将当前数组放入一个list中。
* 时间复杂度:O(nlgn) 中间采用快速排序,合并数组只需要O(n)遍历一次
* 空间复杂度:O(n)
*/
public static int[][] merge(int[][] intervals) {
Arrays.sort(intervals, new Comparator<int[]>() { // 根据每个数的第一个数按正序排序
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0]>o2[0])
return 1;
else if (o1[0]<o2[0])
return -1;
else
return 0;
}
});
List<int[]> list=new ArrayList<>(); // 创建一个数组用于list用于存放合并后的数组
for (int i=1;i<intervals.length;i++){ // 注意这个是从1开始的
if (intervals[i-1][intervals[i-1].length-1]>=intervals[i][0]){ // 如果后一个数组的第一个数比前一个数组的最后一个数小,则将前一个数组的第一个数赋值给后一个数组的第一个数
intervals[i][0]=intervals[i-1][0];
if (intervals[i-1][intervals[i-1].length-1]>=intervals[i][intervals[i].length-1]){ // 如果后一个数组的最后一个数比前一个数组的最后一个数小,则将前一个数组的最后一个数赋值给后一个数组的最后一个数
intervals[i][intervals[i].length-1]=intervals[i-1][intervals[i-1].length-1];
}
}else { // 否则的话说明前一个数组已经不需要合并了,加入结果list中
list.add(intervals[i-1]);
}
}
list.add(intervals[intervals.length-1]); // 最后一个数组无论有没有经过合并都不会被放入结果list中,所以这里单独放入
int[][] result=new int[list.size()][]; // 创建返回数组,遍历list最后将其返回
for (int i=0;i<list.size();i++){
result[i]=list.get(i);
}
return result;
}
}
56使用排序解决合并区间问题。排序
最新推荐文章于 2024-08-21 10:11:50 发布