题目给出很多由整数表示的区间,将区间合并后返回。
首先要问区间是用整数还是什么数表示的,然后问是开区间还是闭区间,比如[3,4)和[4,5)不能合并,但是[3,4]和[4,5]就可以合并为[3,5]。在这题中是整数表示的闭区间。
先将区间排序。按照左端点从小到大排序,左端点一样的按照右端点从大到小排序(从小到大也行)。
然后扫描排序好的区间,维护一个当前区间。如果当前区间的右端点比扫描到的左端点还小,那么当前区间就不可能再跟后面区间有相交了(因为已经排过序了),保存并更新当前区间。如果当前区间和扫描到的区间有相交,就合并和更新当前区间。
代码:
static bool compare(Interval a, Interval b) {
return (a.start < b.start || (a.start == b.start && a.end < b.end));
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> result;
if(intervals.size() == 0)
return result;
sort(intervals.begin(), intervals.end(), compare);
Interval cur(intervals[0].start, intervals[0].end);
for(auto i = intervals.begin() + 1 ; i != intervals.end() ; i++) {
if(cur.end < i->start) {
result.push_back(cur);
cur = *i;
}
else {
cur.end = max(cur.end, i->end);
}
}
result.push_back(cur);
return result;
}