给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
这个题主要是看后面区间的开头和前面区间的结尾的大小,如果后面开头小于前面区间的结尾,那么说明就有重叠,这里如果继续往后看,再之后的一个区间的开头小于第二个区间,那么说明三个区间都重叠,直接取一开始的开头和最后的结尾即可。当然这个想法是需要这个区间集合是有序的,从小到大排列的,可以拆分开头和结尾,开头存到一个数组,结尾存到一个数组,然后对这两个数组进行排序,然后使用两个指针i,j,开始时都指向开头,然后i开始移动对比每个区间的开头和其上一个区间的结尾,如果开头大于结尾,说明没有重叠,否则继续对比,没有重叠时可以保存开头j和结尾i。保存之后i和j指向下一个区间。
C++源代码:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
int n = intervals.size();
vector<int> start, end;
vector<Interval> res;
for (int i=0;i<n;i++)
{
start.push_back(intervals[i].start);
end.push_back(intervals[i].end);
}
sort(start.begin(), start.end());
sort(end.begin(), end.end());
for (int i=0,j=0;i<n;i++)
{
if (i==n-1 || start[i+1]>end[i])
{
res.push_back(Interval(start[j], end[i]));
j = i+1;
}
}
return res;
}
};
python3源代码:
# Definition for an interval.
# class Interval:
# def __init__(self, s=0, e=0):
# self.start = s
# self.end = e
class Solution:
def merge(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[Interval]
"""
n = len(intervals)
res = []
start = [x.start for x in intervals]
end = [x.end for x in intervals]
start.sort()
end.sort()
j = 0
for i in range(n):
if i==n-1 or start[i+1]>end[i]:
res.append(Interval(start[j], end[i]))
j = i + 1
return res