以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
**输入:** intervals = [[1,3],[2,6],[8,10],[15,18]]
**输出:** [[1,6],[8,10],[15,18]]
**解释:** 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
**输入:** intervals = [[1,4],[4,5]]
**输出:** [[1,5]]
**解释:** 区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
思路:排序后寻找区间内的最大右端点,当右端点比左侧端点小的时候,将该区间加入到答案中
class Solution {
public int[][] merge(int[][] intervals) {
int i=0,j=0,max;
ArrayList<int[]> ans =new ArrayList<>();
//排序
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
while(i<intervals.length){
j=i;
max=intervals[i][1];
//寻找最大右端点,且最大右端点比下一个区间的左端点小
while(j+1<intervals.length && max>=intervals[j+1][0]){
max=Math.max(max,intervals[j+1][1]);
j++;
}
//加入到答案中
ans.add(new int[]{intervals[i][0],max});
i=j+1;
}
return ans.toArray(new int[ans.size()][]);
}
}