C ++中的滑动窗口最大值

假设我们有一个叫做nums的数组,有一个大小为k的滑动窗口,它从数组的左边移到右边。我们只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。我们必须找到最大滑动窗口。因此,如果输入像-[1,3,-1,-3,5,3,6,8]并且k为3,则窗口将像-

窗口位置最高
13-1-353683
13-1-353683
13-1-353683
13-1-353685
13-1-353686
13-1-353688

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个数组ans

  • 定义一个双头队列dq

  • 如果nums的大小等于0,则返回ans

  • 用于初始化i:= 0,当i <k时,将i增加1做-

    • 删除dq的最后一个元素

    • 当dq不为空且nums [dq的最后一个元素] <nums [i]时,执行

    • 在dq的末尾插入i

    • 用于初始化i:= k,当i <nums.size(时,将i增加1做-

      • 删除dq的最后一个元素

      • 从dq中删除前元素

      • 插入(nums [dq的前元素])到ans

      • 当dq不为空且dq的前元素<(ik + 1)时,执行-

      • 当dq不为空并且nums [dq的最后一个元素] <nums [i]时,执行-

      • 在dq的末尾插入i

      • 在末尾将nums [dq的前元素]插入ans

      • 返回ans

      示例

      让我们看下面的实现以更好地理解-

      #include <bits/stdc++.h>
      using namespace std;
      void print_vector(vector<auto> v){
         cout << "[";
         for(int i = 0; i<v.size(); i++){
            cout << v[i] << ", ";
         }
         cout << "]"<<endl;
      }
      void print_vector(vector<vector<auto> > v){
         cout << "[";
         for(int i = 0; i<v.size(); i++){
            cout << "[";
            for(int j = 0; j <v[i].size(); j++){
               cout << v[i][j] << ", ";
            }
            cout << "],";
         }
         cout << "]"<<endl;
      }
      class Solution {
         public:
         vector<int> maxSlidingWindow(vector<int>& nums, int k) {
            vector <int> ans;
            deque <int> dq;
            if(nums.size()==0)return ans;
            for(int i =0;i<k;i++){
               while(!dq.empty() && nums[dq.back()]<nums[i])dq.pop_back();
               dq.push_back(i);
            }
            for(int i = k;i<nums.size();i++){
               ans.push_back(nums[dq.front()]);
               while(!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);
            }
            ans.push_back(nums[dq.front()]);
            return ans;
         }
      };
      main(){
         Solution ob;
         vector<int> v = {1,3,-1,-3,5,3,6,8};
         print_vector(ob.maxSlidingWindow(v,3));
      }

      输入值

      {1,3,-1,-3,5,3,6,8}

      输出结果

      [3, 3, 5, 5, 6, 8, ]