一、题目:56. 合并区间
二、题目解析:
题目解析:该题用到的是扫描线算法
解题步骤:
- 先将区间按照左边界排序
- 定义一个存放结果的数组
- 遍历每个区间
3.1 如果结果数组是空的,或者当前区间的起始位置 > 结果数组中最后区间的终止位置则不合并,直接将当前区间加入结果数组。
3.2 将当前区间的结束位置和结果数组中最后一个区间的结束位置做比较,取最大的,同时更新结果数组最后一个区间的结束位置
3.3 去掉结果数组中多余的空位置[0,0]
图示帮助理解:
三、代码如下:
public int[][] merge(int[][] intervals) {
// 先按照区间起始位置排序
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
// 遍历区间
int[][] res = new int[intervals.length][2];
int idx = -1;
for (int[] interval: intervals) {
// 如果结果数组是空的,或者当前区间的起始位置 > 结果数组中最后区间的终止位置,
// 则不合并,直接将当前区间加入结果数组。
if (idx == -1 || interval[0] > res[idx][1]) {
res[++idx] = interval;
} else {
// 反之将当前区间合并至结果数组的最后区间
res[idx][1] = Math.max(res[idx][1], interval[1]);
}
}
//res数组长度是intervals.length,最后这个copyOf为了削掉多的空余位置([0,0])
return Arrays.copyOf(res, idx + 1);
}
四、测试
五、结束