Total Accepted: 63180
Total Submissions: 252043
Difficulty: Hard
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
Subscribe to see which companies asked this question
Hide Similar Problems
这道题和编程之美上2.19 区间重合判断很像。都可以采用线段树的思想实现。
将给定的区间集合按照区间左端点从小到大排列。
合并的时候注意区间右端点要进行比较,取较大者。
代码如下(已AC 2016-03-28):
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
// 按照区间左端点从小到大排列
bool cmp(const Interval& a, const Interval& b)
{
return a.start < b.start;
}
vector<Interval> merge(vector<Interval>& v) {
if (v.size() <= 0) return vector<Interval>();
// 先按照start从小到大排序
sort(v.begin(), v.end(), cmp);
vector<Interval>::iterator it = v.begin();
int st = (*it).start, ed = (*it).end;
vector<Interval> res;
for (; it != v.end(); ++it)
{
// 除去最后一个区间
if ((it + 1) != v.end())
{
// 区间不能合并
if ((it + 1)->start > ed)
{
res.push_back(Interval(st, ed));
st = (it + 1)->start;
}
// 要比较区间的结束 有可能出现[1 5] [2 4] 这样区间结束是较大者
ed = ((it + 1)->end > ed) ? (it + 1)->end : ed;
}// end if
// 最后一个区间单独考虑
else
{
if (it->start > ed)
{
res.push_back(Interval(st, ed));
res.push_back(*it);
}//end if
else
{
ed = ((it)->end > ed) ? (it)->end : ed;
res.push_back(Interval(st, ed));
}//end else
}//end else
}//end for
return res;
}