20. 滑动窗口最大和

51 阅读1分钟

239. 滑动窗口最大值 - 力扣(LeetCode)

有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止,

每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所有窗口和的最大值。

#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;

vector<int> func(const vector<int> &nums, int k) {
    vector<int> res;
    deque<int> que;
    for (int i = 0; i < nums.size(); i++) {
        while (!que.empty() && nums[i] >= nums[que.back()]) {
            que.pop_back();
        }
        que.push_back(i);
        while(que.front() <= i - k) {
            que.pop_front();
        }
        if (i >= k-1) {
            res.push_back(nums[que.front()]);
        }
    }
    return res;
}

int main() {
    int N, M;
    vector<int> vec;

    cin >> N;
    int t;
    for (int i = 0; i < N; i++) {
        cin >> t;
        vec.push_back(t);
    }
    cin >> M;
    vector<int> res = func(vec, M);
    cout << *max_element(res.begin(), res.end());
    return 0;
}