leetcode 986 区間交差、ダブル ポインター トラバーサル

986. 間隔リストの交差

中程度の難易度 283 のお気に入りと共有 英語に切り替えて、動的なフィードバックを受け取ります

 いくつかの閉じた区間 firstList と から構成される2 つのリストがあるとします。secondList ここで、 firstList[i] = [starti, endi] と secondList[j] = [startj, endj] 。間隔の各リストは ペアごとに素であり 、 ソートされています 。

これら 2 つの間隔リストの交差部分を返します  。

正式には、閉区間 [a, b](ここで a <= b) は x 実数のセット を表しますa <= x <= b 。

2 つの閉区間の 共通部分は 、実数のセット (空集合または閉区間のいずれか) です。たとえば、[1, 3] と の 交点[2, 4] は です [2, 3] 。

例 1:

入力: firstList = [[0,2],[5,10],[13,23],[24,25]]、 SecondList = [[1,5],[8,12],[15,24] ,[25,26]]
出力: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

例 2:

入力: firstList = [[1,3],[5,9]]、 SecondList = []
出力: []

例 3:

入力: firstList = []、nextList = [[4,8],[10,12]]
出力: []

例 4:

入力: firstList = [[1,7]]、 SecondList = [[3,10]]
出力: [[3,7]]

ヒント:

  • 0 <= firstList.length, secondList.length <= 1000
  • firstList.length + secondList.length >= 1
  • 0 <= starti < endi <= 109
  • endi < starti+1
  • 0 <= startj < endj <= 109
  • endj < startj+1

パス数: 44,426 提出数: 64,986

 解決策: この質問は難しいものではありません。区間の交点を見つけるだけです。これらはすべて閉じた区間であることに注意して、その区間を 1 回横断して結果を取得します。アイデアが明確である限り、コードは何度でも書くことができます。

class Solution {
public:
    vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
        vector<vector<int>> res;
        if(firstList.size()==0 || secondList.size()==0)
            return res;
        else
        {
            int i=0,j=0;
            while(i<firstList.size() && j<secondList.size())
            {
                // 如果没有交集的情况
                if(firstList[i][0]>secondList[j][1] || firstList[i][1]<secondList[j][0])
                {
                    if(firstList[i][0]>secondList[j][1])
                        j++;
                    else
                        i++;
                }
                else
                {
                    vector<int> tem;
                    int left=max(firstList[i][0],secondList[j][0]);
                    int right=min(firstList[i][1],secondList[j][1]);
                    tem.push_back(left);
                    tem.push_back(right);
                    res.push_back(tem);
                    if(firstList[i][1]<secondList[j][1])
                        i++;
                    else
                        j++;
                }
            }
            return res;
        }
    }
};

結果:

合格

詳細を表示

メモを追加する

実行時間: 24 ミリ秒、すべての C++ 送信の 92.77% を上回りました

メモリ消費量: 19.3 MB、すべての C++ 送信のユーザーの 8.99% を上回ります

合格したテスト ケース: 85/85

おすすめ

転載: blog.csdn.net/weixin_41579872/article/details/124918117