LeetCode56.合并区间
题目描述
/**
*
* 以数组 intervals 表示若干个区间的集合,
* 其中单个区间为 intervals[i] = [starti, endi] 。
* 请你合并所有重叠的区间,并返回一个不重叠的区间数组,
* 该数组需恰好覆盖输入中的所有区间。
*
*/
思路分析
- 先将二维数组中的元素一维数组按照一维数组的第一个元素大小按照升序排列,可以借助比较器
- 然后创建一个ArrayList集合保存合并后的结果
- 先将二维数组中的第一个元素加入到集合,然后判断二维数组中的下一个元素和当前集合中的元素有没有重复,如果重复,则更新当前集合中的元素,扩大范围,如果没有重复,则再添加到集合,以此类推
- 最后将集合以数组形式返回
- 源码及详解见下
源码及分析
public int[][] merge(int[][] intervals) {
//如果二维数组中只有一个一维数组,则没有重复的
if (intervals.length == 1) {
return intervals;
}
//对二维数组中的元素 按照一维数组第一个元素进行升序排列,使用比较器
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
//创建一个集合保存合并后的结果
ArrayList<int[]> merger = new ArrayList<>();
//先将第一个一维数组取出来放到集合中,然后判断当前一维数组的左侧元素是否大于集合中一维数组的右侧元素
//遍历二维数组中的元素
for (int i = 0, j = 0; i < intervals.length; i++) {
//如果集合是空的,则直接将数组中的第一个元素加入集合
if (merger.isEmpty()) {
merger.add(intervals[i]);
j++;
//否则判断集合的最后一个元素是否大于等于当前数组中一维数组的第一个元素,如果大于,说明重合
} else if (merger.get(j - 1)[1] >= intervals[i][0]) {
//则替换当前集合中的小值
merger.set(j - 1, new int[]{merger.get(j - 1)[0], Math.max(intervals[i][1],merger.get(j - 1)[1])});
} else {
//如果不重合,则直接添加
merger.add(intervals[i]);
j++;
}
}
//将集合以二维数组的形式返回
return merger.toArray(new int[merger.size()][]);
}