剣は、オファー59-I / 59-IIのスライディングウィンドウの最大値/キューC ++の最大値を指します

59-私

タイトル説明

ここに画像の説明を挿入します

ソリューションの両端キュー

増加し続ける両端キューを後ろから前に維持します。キューの先頭はスライディングウィンドウの最大値です。ウィンドウが1つの位置だけ移動する場合、次の2つのアクションがあります。

  1. チームの最後から新しい要素を入力し、それよりも大きい要素が見つかるまで、それよりも小さい要素をポップし続けてから、チームの最後に押し込みます。
    新しく入力した番号がチームの番号よりも大きいことを理解するのは難しくありません。これは、チームの番号がまったく意味がなく、最大値にすることはできず、外出する時間が新しい番号よりも早くなければならないことを示しています。
  2. 古い要素をポップアップするには、行の先頭にある要素がポップアップされた要素と同じであるかどうかを判断するだけで済み、同じ場合はポップアップされます。
    チームのリーダーがポップアップした後、新しい要素がモバイルウィンドウの最大の要素ではないことを尋ねることができますが、モバイルウィンドウの最大の要素がまだチームのリーダーにあることをどのように知っていますか?私たちは、最大の要素は、この時点でチームの先頭であると仮定し、それが後に入力されているよりも小さい要素。この要素は次のウィンドウの最大値になる可能性を持っている場合、それは間違いで保存されますチームのトップの次の位置。これは最初のチームの最大の要素です。
    要約すると、新しい番号に遭遇すると、以前の小さい番号は単に破棄され、新しい番号が最初に入れられます。
class Solution {
    
    
public:
    void popNum(deque<int>& que, int value) {
    
    
        if(!que.empty() && que.front() == value) que.pop_front();
    }
    void pushNum(deque<int>& que,int value) {
    
    
        while(!que.empty() && que.back() < value) que.pop_back();
        que.push_back(value);
    }
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    
    
        if(nums.size()==0) return {
    
    };
        deque <int> que; 
        vector<int> ans;
        //先将处理前k个元素
        for(int i = 0; i < k; i ++) {
    
    
            pushNum(que, nums[i]);
        }
        //前k个元素的最大值
        ans.push_back(que.front());
        for(int i = k; i < nums.size(); i++) {
    
    
            pushNum(que, nums[i]);
            popNum(que, nums[i - k]);
            ans.push_back(que.front());
        }
        return ans;

    }
};


時間計算量O(N)、各要素は最大で1回ポッププッシュできます
空間計算量O(K)

59-II

タイトル説明

ここに画像の説明を挿入します

ソリューション支援の両端キュー

今のアイデアに従って、最大値を維持する補助両端キューを作成してから、ポップとプッシュの一般的なキューを作成します。ポップするときは、両端キューの先頭がポップされているかどうかを確認します。

class MaxQueue {
    
    
public:
    //获取最大值用的
    deque<int> que;
    //存储数字
    queue<int> q;
    MaxQueue() {
    
    
    }
    
    int max_value() {
    
    
        if(que.empty()) return -1;
        return this -> que.front();
    }
    
    void push_back(int value) {
    
    
        while(!this -> que.empty() && value > this -> que.back()) this -> que.pop_back();
        this -> que.push_back(value);
        this -> q.push(value);
    }
    
    int pop_front() {
    
    
        if(q.empty()) return -1;
        if(q.front() == que.front()) que.pop_front();
        int ans = q.front();
        q.pop();
        return ans;
    }
};

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue* obj = new MaxQueue();
 * int param_1 = obj->max_value();
 * obj->push_back(value);
 * int param_3 = obj->pop_front();
 */

ここに画像の説明を挿入します

時間計算量O(1)
空間計算量O(N)

おすすめ

転載: blog.csdn.net/qq_42883222/article/details/112646094
おすすめ