原題
配列を使用してintervals
、複数の間隔のセットを表します。ここで、1 つの間隔は ですintervals[i] = [starti, endi]
。重複する間隔をすべてマージし、入力内のすべての間隔を正確にカバーする重複しない間隔の配列を返してください 。
例 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] は重複する間隔と見なすことができます。
ヒント:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
問題解決のアイデア
どのような状況で間隔をマージする必要がありますか? もちろん、ある区間が別の区間にある場合は、その区間の開始位置のみをマージする必要があります。間隔は Range であり、left と and の 2 つの値が含まれると仮定します。処理を楽にするためにRange1の左右の間にRange2.leftを作る必要があるので、ここではleftを基準にソートする必要があります。左順の場合、マージされた範囲は [Range1.left, newRight] (newRight = max(Range1.right, Range2.right)) になります。並べ替えられた間隔を結果配列に順番に追加できます。現在の間隔が結果配列の最後の間隔と重複しない場合 (つまり、Range2.left>Range1.right)、それを追加します。それ以外の場合は、結果配列の最後の間隔をマージされた間隔で置き換えます (厳密に言えば、最後の間隔の Right を newRight に置き換えるだけです)。完全な実装は次のとおりです。
lass Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 0) {
return {};
}
sort(intervals.begin(), intervals.end());
vector<vector<int>> merged;
for(int i = 0; i < intervals.size(); i++){
int L = intervals[i][0], R = intervals[i][1];
if (!merged.size() || merged.back()[1] < L) {
merged.push_back({L, R});
}
else {
merged.back()[1] = max(merged.back()[1], R);
}
}
return merged;
}
};
やっと
間隔の結合は非常に便利なアルゴリズムで、今年はデータエンジン会社と協力してテレビ局の動画APPのポイント埋め込み計画を実施しました。その 1 つは、特定のビデオの視聴時間をカウントすることです。この時間の長さは、通常の意味での視聴時間ではなく、ビデオ コンテンツが 1 つの速度で視聴されたか複数回視聴されたかにかかわらず、視聴された時間の長さです。次に、各操作、再生、一時停止、ドラッグの開始と終了、切り替え速度などを記録し、これらのイベント ポイントを間隔に変換し、間隔のマージを実装して、最終的に目的の結果を得る必要があります。区間マージは実際の開発においても非常に役立つことがわかります。