這是一道知道技巧就能比較容易解決的題。題目要求對於給出的各個區間,如果有區間出現重疊,那就將它們合併。題意很容易理解,但是乍一看會覺得難以用編程來實現。直接能想到的方法比如不停地遍歷整個區間的集合,如果發現有交疊就合併,直到沒有交疊。這種方法比較費時,實現起來也不容易。其實雖然現在做的算法題不多,但是先排個序就能讓問題變簡單的題目不少。這題也是如此。
對於這道算法題,可以先按每個區間的下界從小到大排個序,然後遍歷整個集合,如果發現下一集合和這個集合有交集就合併(對於合併操作,只需要設置兩個變量記錄區間的下界和上界即可,存入結果集合時才根據它們進行區間的實例化),如果沒有交集就說明已經得到一個最終的合併的區間,於是可以將上一次合併的區間保存。遍歷結束之後,再將得到的最後一個區間保存。這樣就大功告成了。
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;
}
};