当前位置:首页 > 牛客 > 牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

9个月前 (06-15)

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)  滑动窗口最大值 单调队列 C++代码 第1张

一、题目解读

牛客3750题要求在一个给定的整数数组中,计算指定窗口大小下的滑动窗口最大值。例如,输入数组num=[1,3,-1,-3,5,3,6,7],窗口大小为size=3时,需输出每个窗口内的最大值序列[3,5,5,6,7]。该题目考察对数组滑动窗口操作及高效数据结构的运用,核心在于如何在移动窗口时快速获取当前窗口的最大值。

二、解题思路

参考代码采用单调队列(Monotonic Queue)优化算法。通过维护一个存储元素下标的双端队列,确保队列中元素对应值始终单调递减。当新元素进入窗口时,通过弹出队尾较小值保持队列单调性,同时弹出队首过期元素(超出窗口范围),最终队首元素即为当前窗口最大值。该解法将时间复杂度降至O(n),避免暴力遍历每个窗口。

三、解题步骤

1. 初始化:创建结果向量result和存储下标的单调队列dq。

2. 窗口遍历:

    判断队首下标是否超出窗口范围,若超出则弹出队首。

    从队尾弹出所有小于当前元素的值,维持队列单调递减。

    将当前下标加入队列。

3. 结果记录:当窗口形成(即当前索引≥窗口大小-1)时,将队首元素值加入结果向量。

4. 返回结果:最终返回最大值序列。

四、代码与注释

#include <vector>
#include <deque>
#include <stdexcept>
using namespace std;

class Solution {
public:
    vector<int> maxInWindows(vector<int>& num, int size) {
        vector<int> result;
        deque<int> dq; // 存储下标,保证队列中元素对应值单调递减

        for (int i = 0; i < num.size(); ++i) {
            // 移除超出窗口范围的元素
            while (!dq.empty() && dq.front() <= i - size) {
                dq.pop_front();
            }
            
            // 维护单调递减队列
            while (!dq.empty() && num[dq.back()] < num[i]) {
                dq.pop_back();
            }
            
            dq.push_back(i);
            
            // 当窗口形成后开始记录结果
            if (i >= size - 1) {
                result.push_back(num[dq.front()]);
            }
        }
        
        return result;
    }
};

注释说明:

● 使用deque存储下标而非元素值,避免值重复时的误判。

● 两个while循环分别处理过期元素和队列单调性,确保队首为窗口内最大值下标。

● 仅当窗口完整时记录结果,避免前缀无效计算。

五、总结

该解法巧妙利用单调队列的特性,将滑动窗口的遍历与动态维护最大值结合,实现线性时间复杂度。在实际应用中,此类算法适用于需要高效处理数据流或连续区间极值的问题,尤其在在线数据处理场景中表现优异。掌握单调队列思想对提升算法效率具有重要意义。

原创内容 转载请注明出处

分享给朋友:

相关文章

手搓二叉搜索树代码详解:从入门到实现(附完整注释)

一、简介和应用二叉搜索树(Binary Search Tree,BST)是一种经典的数据结构,其特点在于每个节点的左子树所有节点值均小于该节点,右子树所有节点值均大于该节点。这种特性使得它在查找、插入...

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

一、题目解读力扣3115题要求在一个整数数组中,找出两个质数之间的最大差值。若数组不存在质数,则返回0。题目核心在于高效筛选质数,并计算其索引差值的最大值,需兼顾时间与空间复杂度。二、解题思路参考代码...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

力扣1011题详解:船只装载问题的二分查找优化解法(C++代码实现)

力扣1011题详解:船只装载问题的二分查找优化解法(C++代码实现)

一、题目解读力扣1011题要求在给定的货物重量数组中,计算船只每天最多装载一定重量时,最少需要多少天完成运输。题目关键在于找到满足天数限制的最小最大载重量,属于典型的查找最值问题。二、解题思路采用二分...

【力扣LCR42题解析】套圈游戏:用距离平方优化算法解题

【力扣LCR42题解析】套圈游戏:用距离平方优化算法解题

一、题目解读力扣LCR42题“圆圈游戏”要求计算给定玩具集合中,能被套圈覆盖的玩具数量。每个玩具和套圈均由坐标及半径定义,需判断玩具是否在套圈覆盖范围内。题目核心在于高效计算点与圆的位置关系,并统计符...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。