Sword Finger Offer Interview Question 59-I。スライディングウィンドウの最大値[simple] -deque

私の解決策:

1.超暴力。最初の反応が常に激しいわけではありませんが、タイムアウトしました

記念する、または送る

class Solution {
public:
    int func(vector<int> v,int i,int k){
        int res,max=0x80000000;
        for(int j=0;j<k;j++){
            if(v[i+j]>=max){
                res=i+j;
                max=v[i+j];
            }
        }
        return max;
    }
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if(!nums.size())    return {};
        if(k==1)    return nums;
        vector<int> res;
        for(int i=0;i<nums.size()-k+1;i++){
            int tmp=func(nums,i,k);
            res.push_back(tmp);
        }
        return res;
    }
};

2.両端キューを使用します。両端フロント()は、スライディングウィンドウの最大数を表します。

ウィンドウ範囲にない場合は、out_front()をポップします。

新しい要素はキュー要素と比較されます

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n=nums.size();
        if(n<=1||k==1)    return nums;
        vector<int> res;
        deque<int> dq;
        for(int i=0;i<k-1;i++){
            while(!dq.empty() && nums[i]>nums[dq.back()])
                dq.pop_back();
            dq.push_back(i);
        }
        for(int i=k-1;i<n;i++){
            if(!dq.empty()&&dq.front()<i-k+1)    dq.pop_front();
            while(!dq.empty()&&nums[dq.back()]<nums[i]) dq.pop_back();
            dq.push_back(i);
            res.push_back(nums[dq.front()]);
        }
        return res;
    }
};

この質問のおかげで、dequeの使用法を理解させてください

フロント/バック/ポップバック/ポップフロント/プッシュバック/プッシュフロント

公開された65件のオリジナル記事 いいね1 訪問数479

おすすめ

転載: blog.csdn.net/qq_41041762/article/details/105557014
おすすめ