给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:常规思路,将区间按照左边界进行排序,依次遍历合并
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals == null || intervals.length < 2) {
return intervals;
}
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
List<Integer> list = new ArrayList<>();
list.add(intervals[0][0]);
for(int i = 1; i < intervals.length; i++) {
if(intervals[i][0] <= intervals[i - 1][1]) {
intervals[i][1] = Math.max(intervals[i][1], intervals[i -1][1]);
continue;
}else{
list.add(intervals[i-1][1]);
list.add(intervals[i][0]);
}
}
if(list.size() % 2 == 1) {
list.add(intervals[intervals.length - 1][1]);
}
int res[][] = new int [list.size() / 2] [2];
for(int i = 0; i < list.size(); ) {
res[i / 2][0] = list.get(i);
res[i / 2][1] = list.get(i + 1);
i += 2;
}
return res;
}
}
解法二:对左右区间分别排序,如果某右区间比下一个作曲兼大,说明这两个区间会产生交集,继续向后遍历。。(具体思路有点说不清。。。写了太久了,都忘记当时怎么考虑的了。。。)
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals == null || intervals.length < 2) {
return intervals;
}
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
List<Integer> list = new ArrayList<>();
list.add(intervals[0][0]);
for(int i = 1; i < intervals.length; i++) {
if(intervals[i][0] <= intervals[i - 1][1]) {
intervals[i][1] = Math.max(intervals[i][1], intervals[i -1][1]);
continue;
}else{
list.add(intervals[i-1][1]);
list.add(intervals[i][0]);
}
}
if(list.size() % 2 == 1) {
list.add(intervals[intervals.length - 1][1]);
}
int res[][] = new int [list.size() / 2] [2];
for(int i = 0; i < list.size(); ) {
res[i / 2][0] = list.get(i);
res[i / 2][1] = list.get(i + 1);
i += 2;
}
return res;
}
}