题目描述:
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:
输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
先将所有列表按第一个元素排列好顺序。比如a=[1,5],b=[2,7],因为a[1]>b[0],所以两个列表有重合部分。数列左边已经确定为a[0],只要比较a[1]和b[1]谁大即可。用left来记录数列左区间,用right来记录数列右区间。然后将一个个列表分别加入到大列表中。
通过答案:
class Solution {
public int[][] merge(int[][] intervals) {
int len=intervals.length; //列表数量
List<int[]> res=new ArrayList<>(); //大列表
if (intervals == null || intervals.length == 0)
return res.toArray(new int[0][]);
//Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
Arrays.sort(intervals,new Comparator<int[]>(){ //按每个列表第一个元素排列,如果a1[0]>a2[0]就交换顺序
public int compare(int[] a1,int[] a2){
return a1[0]-a2[0];
}
});
int i=0;
while(i<len){
int left=intervals[i][0]; //记录左区间
int right=intervals[i][1]; //记录右区间
while(i<len-1&&intervals[i+1][0]<=right){
i++;
right=Math.max(intervals[i][1],right); //大范围的那个为右区间
}
res.add(new int[]{left,right}); //将列表加入(注意)
i++;
}
return res.toArray(new int[0][]); //输出结果
}
}