Given a set of intervals, merge all overlapping intervals.
Example 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
Example 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
https://leetcode-cn.com/problems/merge-intervals/
Simple merger
First thing to do is to give the interval set sort, because we want to sort a structure, so we have to define your own comparator, in order to use sort to sort, our values start from small to large to sort, drained order that we can He began merger,
First, the result is stored in the first section and the second section traversing from the set,
If the last interval and the current interval traverse the resulting non-overlapping, directly into the current interval results,
If there is overlap, the larger value among the results of the last end section updates the value of the result of the last section and end the current end value, and then continue the walk interval set, so the final result can be obtained, as follows:
c++
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.empty()) return {};
sort(intervals.begin(), intervals.end());
vector<vector<int>> res{intervals[0]};
for (int i = 1; i < intervals.size(); ++i) {
if (res.back()[1] < intervals[i][0]) {
res.push_back(intervals[i]);
} else {
res.back()[1] = max(res.back()[1], intervals[i][1]);
}
}
return res;
}
};
java
class Solution {
public int[][] merge(int[][] intervals) {
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]);
int i = 0;
while (i < intervals.length) {
int left = intervals[i][0];
int right = intervals[i][1];
while (i < intervals.length - 1 && intervals[i + 1][0] <= right) {
i++;
right = Math.max(right, intervals[i][1]);
}
res.add(new int[]{left, right});
i++;
}
return res.toArray(new int[0][]);
}
}
python
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals = sorted(intervals)
res = []
n = len(intervals)
i = 0
while i < n:
left = intervals[i][0]
right = intervals[i][1]
while i < n - 1 and intervals[i+1][0] <= right:
i += 1
right = max(intervals[i][1], right)
res.append([left, right])
i += 1
return res
Double pointer
c++
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 0 || intervals.size() == 1) return intervals;
int u = 0, v = 0;
vector<vector<int>> ans;
std::sort(intervals.begin(), intervals.end());
while (v < intervals.size()) {
if (intervals[v][0] > intervals[u][1]) {
ans.emplace_back(intervals[u]);
u = v;
} else if (intervals[v][1] <= intervals[u][1]) {
++ v;
} else {
intervals[u][1] = intervals[v][1];
++ v;
}
}
ans.emplace_back(intervals[u]);
return ans;
}
};