大家好,我是银包金。今天分享的题目是LeetCode热题100中的题目 合并区间,分享解题思路。
先看题目:
题意也就是说不能有重合的部分,那么这个初始数组它可以是无序的,所以我们上来先对其进行了排序。
排序可以根据start也可以根据end,这两种都可以,只是后续遍历的时候一个从前往后一个从后往前。
这里我们以start来排序
排好序之后就可以每遍历一个就跟上一个做一次比较:看一下我的start是不是大于等于上一个的end,如果是就要合并,即直接修改上一个的end。
代码如下:
class Solution {
public int[][] merge(int[][] intervals) {
//排序
Arrays.sort(intervals,(p,q)->(p[0]-q[0]));
List<int[]>ans = new ArrayList<>();
//遍历合并
for(int[]p : intervals){
int n = ans.size();
if(n>0&& p[0] <= ans.get(n-1)[1]){
ans.get(n-1)[1] = Math.max(ans.get(n-1)[1],p[1]);
}else{
ans.add(p);
}
}
return ans.toArray(new int[ans.size()][]);
}
}
这里需要注意的是:
ArrayList不能直接当做二维数组返回,必须toArray转换;toArray(new int[ans.size()][])指定输出为二维数组,规避Object[]强转问题;new int[长度][]是 Java 不规则二维数组声明,适配不定长的一维区间数组。