力扣239. 滑动窗口最大值

class Solution {
private:
    class MyQueue {
    public:
        deque<int> que;
        void pop(const int& pt) {
            if(!que.empty() && que.front() == pt) que.pop_front();
        }

        void push(const int& pt) {
            while(!que.empty() && que.back() < pt) que.pop_back();
            que.push_back(pt);
        }

        int getMax() {
            return que.front();
        }
    };

public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for(int i = 0; i < k; i++) {
            que.push(nums[i]);
        }
        result.push_back(que.getMax());
        for(int slow = 0, fast = k; fast < nums.size(); slow++, fast++) {
            que.pop(nums[slow]);
            que.push(nums[fast]);
            result.push_back(que.getMax());
        }

        return result;
    }
};
### 关于滑动窗口最大值问题的解法 对于给定的一个整数数组 `nums` 一个大小为 `k` 的滑动窗口,目标是从左至右遍历该数组并记录每一个滑动窗口中的最大值。一种直观的方法是通过暴力求解来获取每个窗口的最大值,然而这种方法的时间复杂度较高,达到 O((n - k + 1) * k)[^1]。 为了提高效率,可以采用更优的数据结构——单调队列来进行处理。单调队列是一种特殊的双端队列,在这里用于存储当前窗口内元素下标的集合,并保持这些下标对应的数值按降序排列[^4]。具体来说: - 当新元素进入窗口时,移除队列中所有小于等于它的元素(因为它们不可能成为后续任何窗口的最大值),再将新的元素加入到队尾; - 如果队首元素已经不在当前窗口范围内,则将其弹出; - 此时队首即为当前窗口的最大值所在位置; 下面给出基于上述逻辑的具体 Python 实现方式: ```python from collections import deque def maxSlidingWindow(nums, k): result = [] window = deque() for i in range(len(nums)): # 移除不在当前窗口范围内的索引 if window and window[0] <= i - k: window.popleft() # 维护单调递减性质 while window and nums[i] >= nums[window[-1]]: window.pop() window.append(i) # 记录结果 if i >= k - 1: result.append(nums[window[0]]) return result ``` 此算法能够在线性时间内完成计算,时间复杂度降低到了 O(n),极大地提高了程序运行效率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值