以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
class Solution {
public int[][] merge(int[][] intervals) {
if (intervals.length == 0) return intervals;
//1、对二维数组按照第一列升序排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
//2、进行合并数组
List<int []> list = new ArrayList<>();
int term[] =intervals[0];//临时引用,1 判断是否需要合并集合,2 是否放入结果集
for (int i = 1; i < intervals.length; i++) {
if (term[1]>=intervals[i][0]){
term[1]=Math.max(term[1],intervals[i][1]);
}else {
list.add(term);
term=intervals[i];
}
}
list.add(term);
return list.toArray(new int[0][]);
}
}
作者:Hailin
1、对二维数组进行排序,按照第一列升序列排列
2、借用临时空间,判断是否需要何合并集合当前值,当前集合是否放入结果集触发点
知识点
1 利用toArray将list转成二维数组
List<int[]> list = new ArrayList<>();
list.toArray(new int[0][]);
为什么写0?看ArrayList的toarray源码
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
当T泛型的长度没有list的size大时,会以size长度返回T;否则,使用传入的T。为了节省空间(长度太长,数组后面的都会赋值null,就会比真正的结果多出一截null),toArray(new int[0][])里面的一维数组长度写0就行
2 System.arraycopy拷贝
System中提供了一个native静态方法arraycopy(),可以使用这个方法来实现数组之间的复制。对于一维数组来说,这种复制属性值传递,修改副本不会影响原来的值。对于二维或者一维数组中存放的是对象时,复制结果是一维的引用变量传递给副本的一维数组,修改副本时,会影响原来的数组。
System.arraycopy的函数原型是:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
其中:src表示源数组,srcPos表示源数组要复制的起始位置,desc表示目标数组,length表示要复制的长度。
原文链接
3 Arrays.copyOf
源码
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
4 反射
在Java的反射机制中,数组可以通过getClass()方法获得数组的Class<? extend T[]>对象,数组的Class对象可以通过getComponentType()
方法可以取得一个数组的Class<?>对象, 通过Array.newInstance()
可以反射生成数组对象