![这里写图片描述](https://img-blog.csdn.net/20171122155509112?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzg3Njc2Njg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这是一道知道技巧就能比较容易解决的题。题目要求对于给出的各个区间,如果有区间出现重叠,那就将它们合并。题意很容易理解,但是乍一看会觉得难以用编程来实现。直接能想到的方法比如不停地遍历整个区间的集合,如果发现有交叠就合并,直到没有交叠。这种方法比较费时,实现起来也不容易。其实虽然现在做的算法题不多,但是先排个序就能让问题变简单的题目不少。这题也是如此。
对于这道算法题,可以先按每个区间的下界从小到大排个序,然后遍历整个集合,如果发现下一集合和这个集合有交集就合并(对于合并操作,只需要设置两个变量记录区间的下界和上界即可,存入结果集合时才根据它们进行区间的实例化),如果没有交集就说明已经得到一个最终的合并的区间,于是可以将上一次合并的区间保存。遍历结束之后,再将得到的最后一个区间保存。这样就大功告成了。
class Solution {
public:
bool static cmp(const Interval& a, const Interval& b) {
return a.start < b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> result;
if (intervals.size() <= 1) {
result = intervals;
return result;
}
sort(intervals.begin(), intervals.end(), cmp);
int lastEnd = intervals[0].end;
int lastStart = intervals[0].start;
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i].start <= lastEnd) {
if (intervals[i].end > lastEnd) {
lastEnd = intervals[i].end;
}
} else {
result.push_back(Interval(lastStart, lastEnd));
lastEnd = intervals[i].end;
lastStart = intervals[i].start;
}
}
result.push_back(Interval(lastStart, lastEnd));
return result;
}
};