以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
解题思路:首先将每个区间的项首排序,这样方便判断是否能够进行合并。eg:要合并区间[3,8],[1,4],[6,9],[23,45].
-
直观地还是要先按照第一个元素排序:
【1,4】,【3,8】,【6,9】,【23,45】; -
判断能否前两个区间:
4>=3成立,可以合并前两项; -
然后选新区间项尾:
max(4,8)=8,即可得到合并去区间【1,8】; -
接着判断新区间【1,8】和第三项【6,9】能否合并:
首先8>6,得知可以合并该项; -
然后选新区间项尾:
max(8,9)=8,即可得到合并去区间【1,9】; -
判断【1,9】和【23,45】能否合并:
9>23不成立,不能合并,则添加新区间【23,45】
最终得到合并后的区间【1,9】,【23,45】。
代码实现
根据思路就很好写出代码实现,但是还是要注意数据类型的灵活应用,选择合适的数据类型,能够更便捷根据思路实现代码。
根据思路,提炼出以下几点:
-
可以使用Arrays.sort()方法对二维数组进行排序,这是一个知识点:
- 重写compare()
- 使用Lambda表达式的方式简写Comparator比较器;
Arrays.sort(intervals, (p, q)->p[0]-q[0]); - Arrays.sort(arr, Comparator.comparingInt(a->a[0]))。
-
要定义一个合适的容器存储新区间:
List<int[]> ans = new ArrayList<>(); -
2,3和4,5和6步骤可以做一个循环语句实现。
for(int[] a:intervals){
int b= ans.size();
if(b>0 && ans.get(b-1)[1]>=a[0]){
if(ans.get(b-1)[1]<a[1]){
ans.get(b-1)[1] = a[1];
}
}
else{
ans.add(a);
}
}
最后得到整体的代码
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (p, q)->p[0]-q[0]);
List<int[]> ans = new ArrayList<>();
for(int[] a:intervals){
int b= ans.size();
if(b>0 && ans.get(b-1)[1]>=a[0]){
if(ans.get(b-1)[1]<a[1]){
ans.get(b-1)[1] = a[1];
}
}
else{
ans.add(a);
}
}
return ans.toArray(new int[ans.size()][]);
}
}
总结:对于这道题依旧是思路不难,还是要灵活运用数据结构和方法,这个过程需要慢慢积累经验,熟练就好。yeah,继续前进吧。
419

被折叠的 条评论
为什么被折叠?



