leetcode 56. Merge Intervals

這裏寫圖片描述

 這是一道知道技巧就能比較容易解決的題。題目要求對於給出的各個區間,如果有區間出現重疊,那就將它們合併。題意很容易理解,但是乍一看會覺得難以用編程來實現。直接能想到的方法比如不停地遍歷整個區間的集合,如果發現有交疊就合併,直到沒有交疊。這種方法比較費時,實現起來也不容易。其實雖然現在做的算法題不多,但是先排個序就能讓問題變簡單的題目不少。這題也是如此。

 對於這道算法題,可以先按每個區間的下界從小到大排個序,然後遍歷整個集合,如果發現下一集合和這個集合有交集就合併(對於合併操作,只需要設置兩個變量記錄區間的下界和上界即可,存入結果集合時才根據它們進行區間的實例化),如果沒有交集就說明已經得到一個最終的合併的區間,於是可以將上一次合併的區間保存。遍歷結束之後,再將得到的最後一個區間保存。這樣就大功告成了。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
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;
        // 當集合大小小於等於1,不可能會有交集
        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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章