リートコードベクトル+間隔マージ56.マージ間隔+ 57.間隔挿入

56.マージ間隔

一連の間隔を指定して、重複するすべての間隔をマージしてください。

例1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]

説明:間隔[1,3]と[2,6]はオーバーラップし、それらを[1,6]にマージします。
例2:

输入: [[1,4],[4,5]]
输出: [[1,5]]

説明:間隔[1,4]と[4,5]は、重複する間隔と見なすことができます。

問題解決
貪欲アルゴリズム
は、指定された配列を最初の数値で並べ替え
ます。重要な点は
、新しい配列作成し、それを指定された配列と比較することです。間隔の左端が間隔内にある場合は、右端の大きい方が選択されます。
ベクトルの使い方に詳しい!vector.size()はvectorが空かどうかを判別でき、vector.back()はvectorの最後の要素を取得できます。

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.size()==0){
            return {};
        }

        sort(intervals.begin(), intervals.end());
        //按first排序

        //新建一个二维数组,保存结果
        vector<vector<int>> result;

        for(int i=0;i<intervals.size();i++)
        {
            int L=intervals[i][0], R = intervals[i][1];
            if(!result.size()||result.back()[1]<intervals[i][0])
                result.push_back(intervals[i]);
            else result.back()[1]=max(intervals[i][1],result.back()[1]);
        }
        return result;
    }
};

57.間隔を挿入

間隔の始まりと終わりでソートされた間隔の重複しないリストを提供します。

リストに新しい間隔を挿入するには、リストの間隔が順序付けられており、重複しないようにする必要があります(必要に応じて、間隔をマージできます)。

例1:

输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]

例2:

输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]

説明:これは、新しい間隔[4,8]が[3,5]、[6,7]、[8,10]と重複しているためです。

問題の解決:複雑さ
NlogNは、最初に新しい間隔を間隔に入れ、次に最初の数値でソートします;
同じことは、後でマージ間隔で行うことができます。

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> result;

        intervals.push_back(newInterval);
        sort(intervals.begin(),intervals.end());

        for(int i=0;i<intervals.size();i++)
        {
            if(!result.size()||intervals[i][0]>result.back()[1])
                result.push_back(intervals[i]);
            else result.back()[1]=max(result.back()[1],intervals[i][1]);

        }
        return result;
    }
};

問題2:複雑度N.
与えられた配列はソートされるため、左辺値はnewintervalより小さく、最初に結果ベクトルに配置されます;
左辺値がnewinterval以上である場合、newintervalを結果配列
にマージしてから、後続の間隔をマージします。

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> result;        

        int i;
        for(i=0;i<intervals.size();i++)
        {
            if(intervals[i][0]<newInterval[0])
                result.push_back(intervals[i]);
            else break;
        }    
            
        if(!result.size()||newInterval[0]>result.back()[1])
            result.push_back(newInterval);
        else result.back()[1]=max(result.back()[1],newInterval[1]);

        for(;i<intervals.size();i++)
        {
            if(!result.size()||intervals[i][0]>result.back()[1])
            result.push_back(intervals[i]);
            else result.back()[1]=max(result.back()[1],intervals[i][1]);
        }
        return result;
    }
};

タイトルリンク:57.間隔の挿入

公開された105元の記事 ウォンの賞賛6 ビュー4944

おすすめ

転載: blog.csdn.net/BLUEsang/article/details/105557851