Leetcode の毎日の質問: 56. マージ間隔

原題

配列を使用して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 つの速度で視聴されたか複数回視聴されたかにかかわらず、視聴された時間の長さです。次に、各操作、再生、一時停止、ドラッグの開始と終了、切り替え速度などを記録し、これらのイベント ポイントを間隔に変換し、間隔のマージを実装して、最終的に目的の結果を得る必要があります。区間マージは実際の開発においても非常に役立つことがわかります。

おすすめ

転載: blog.csdn.net/Mamong/article/details/132525353