1. 程式人生 > >LeetCode Day45 Merge Intervals 合併區間

LeetCode Day45 Merge Intervals 合併區間

解法一:

題目所給區間並非有序,首先要給區間排序,按照每項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;
    }
};