LeetCode Day45 Merge Intervals 合併區間
阿新 • • 發佈:2018-12-01
解法一:
題目所給區間並非有序,首先要給區間排序,按照每項interval的start值,使用lambda函式定義規則:
[](Interval &a, Interval &b) {return a.start < b.start;}
將start值小定義為小。
排序後將res設為intervals的第一項,從第二項到末尾遍歷intervals,若遍歷到的當前項和res最後一項有重疊,更新res末項end值,否則將當前項加入res,程式碼如下:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return {};
sort(intervals.begin(), intervals.end(), [](Interval &a, Interval &b){return a.start < b.start;});
vector<Interval> res{intervals[0]};
for(int i=1;i<intervals.size();i++ ){
if(res.back().end>=intervals[i].start){
res.back().end=max(res.back().end,intervals[i].end);
}
else
res.push_back(intervals[i]);
}
return res;
}
};
解法二
下面這種解法將起始位置和結束位置分別存到了兩個不同的陣列starts和ends中,然後分別進行排序,之後用兩個指標i和j,初始化時分別指向starts和ends陣列的首位置,然後如果i指向starts陣列中的最後一個位置,或者當starts陣列上i+1位置上的數字大於ends陣列的i位置上的數時,此時說明區間已經不連續了,我們來看題目中的例子,排序後的starts和ends為:
紅色為i的位置,藍色為j的位置,那麼此時starts[i+1]為8,ends[i]為6,8大於6,所以此時不連續了,將區間[starts[j], ends[i]],即 [1, 6] 加入結果res中,然後j賦值為i+1繼續迴圈,參見程式碼如下:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return {};
vector<Interval> res;
vector<int> starts,ends;
for(int i=0;i<intervals.size();i++){
starts.push_back(intervals[i].start);
ends.push_back(intervals[i].end);
}
sort(starts.begin(),starts.end());
cout<<starts[0];
sort(ends.begin(),ends.end());
for(int i=0,j=0;i<intervals.size();i++){
if(starts[i+1]>ends[i]||i==intervals.size()-1){
res.push_back(Interval(starts[j],ends[i]));
j=i+1;}
}
return res;
}
};