一、题目
二、思路
将给出的区间按左端点按升序排列,将第一个区间加入到列表ans中,然后比较后续区间,若后续区间的左端点大于当前区间的右端点,直接加入ans中,否则将当前区间的右端点修改为二者右端点的较大值。
三、上代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class Media_56 {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
List<int[]> ans = new ArrayList<int[]>();
for (int[] interval : intervals) {
int l = interval[0], r = interval[1];
if (ans.isEmpty() || ans.get(ans.size() - 1)[1] < l) {
ans.add(interval);
} else {
ans.get(ans.size() - 1)[1] = Math.max(ans.get(ans.size() - 1)[1], r);
}
}
return ans.toArray(new int[ans.size()][]);
}
}
四、看结果
五、知识点分析
5.1 Comparator如何判断升降序
以本题代码为例
用来比较的元素类型为int[ ],compare函数的含义为是否交换两个元素的值,如果interval1[0]>interval2[0],返回true,即交换两个元素的值。所以,经过排序后的数组为按元素索引0处的值升序排列。
5.2 将列表转化为数组
以本题为例,ans是元素类型为int[ ]的数组,将其转化为二维数组代码为
ans.toArray(new int[ans.size()][]);
toArray方法的具体内容可以自行查找学习。