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.間隔の挿入