ソードフィンガーオファーシリーズソードフィンガーオファー59-I:最大スライディングウィンドウ

タイトル説明:

配列番号とスライディングウィンドウのサイズkが与えられた場合、すべてのスライディングウィンドウの中で最大値を見つけてください。

例:

入力:nums = [1,3、-1、-3,5,3,6,7]、およびk = 3
出力:[3,3,5,5,6,7] 
説明: 

  スライディングウィンドウの位置最大値
------------------
[1 3 -1] -3 5 3 6 7 3
 1 [3 -1 -3] 5 3 6 7 3
 1 3 [-1 -3 5] 3 6 7 5
 1 3 -1 [-3 5 3] 6 7 5
 1 3 -1 -3 [5 3 6] 7 6
 1 3 -1 -3 5 [3 6 7] 7

問題解決のアイデア:

主にキューを使用して、スライディングウィンドウの最大値を保存します

ステップ:

  1. まず、チームのヘッドの位置が現在の位置から3を引いたスライディングウィンドウ内にあるかどうかを判断します。そうでない場合は、ヘッドを取り外します。
  2. 現在の位置の値をキュー全体の値と比較し、現在の位置よりも小さいキュー内のすべての値を削除します(キューが大きいものから小さいものへの単調なキューであることを確認してください)
  3. 現在の位置の値をキューに入れます
  4. キューの先頭を配列に入れて、ステップ1に戻ります。

図:

最初の2回は図に示されていませんが、

  1. 最初のトレーニングで位置0
  2. 2番目のループでは、位置1が位置0より大きいため、ステップ2が判断されると、位置1はキューから外れ、この時点で位置1がキューの先頭になり、配列に配置されます。
  3. 位置2は位置1よりも小さいため、位置2がキューに追加され、キューの先頭にある位置1が配列に配置されます。

コード:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& num, int k) {
        vector<int> res;   //存储所有滑动窗口里数值的最大值
        deque<int> q;   //存储滑动窗口里的数据
        for(int i=0;i<num.size();i++)
        {
            //滑动窗口满时,则队头出队列
            while(!q.empty() && i-q.front() >= k)
            {
                q.pop_front();
            }
            //维持队列的单调性
            while(!q.empty() && num[i]>=num[q.back()])
            {
                q.pop_back();
            }
            q.push_back(i);
            if(i>=k-1)
            {
                res.push_back(num[q.front()]);
            }
        }
        return res;
    }
};

 

おすすめ

転載: blog.csdn.net/qq_46423166/article/details/111190709