【剑指offer】面试题59:滑动窗口的最大值【C++版本】

总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】

题目:

滑动窗口的最大值

给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}。

解题思路:

1.这个题目需要使用双向队列deque来进行解答。
2.注意双向队列中存的不是数值,而是下标。

可以AC的解法【C++版本】

#include <iostream>
#include <vector>
#include <deque>
using namespace std;
vector<int> maxInWindows(const vector<int>& num, unsigned int size);
int main() {
       vector<int> data{2,3,4,2,6,2,5,1};
       vector<int> resu = maxInWindows(data, 3);
       for (auto a : resu) {
              cout << a << endl;
       }
       system("pause");
       return 0;
}
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
       vector<int> resu;
       if (num.size() >= size && size >= 1) {
              deque<int> numDeque;
              //首先把前size个数按照规则压入双向队列
              for (int i = 0; i != size; i++) {
                     while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
                           numDeque.pop_back();
                     }
                     numDeque.push_back(i);
              }
              //压入第一个最大值
              //滑动窗口的最大值总是位于双向队列的头部
              resu.push_back(num[numDeque.front()]);
              for (int i = size; i != num.size(); i++) {
                     //首先按照规则压入新的值
                     while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
                           numDeque.pop_back();
                     }
                     //并且删除旧值,即滑出了窗口的值
                     if (!numDeque.empty() && numDeque.front() <= static_cast<int>(i - size)) {
                           numDeque.pop_front();
                     }
                     numDeque.push_back(i);
                     resu.push_back(num[numDeque.front()]);
              }
       }
       return resu;
}

猜你喜欢

转载自blog.csdn.net/m0_37950361/article/details/82153147