2.24练习

题目名称:活动窗口最大值
原题链接:https://leetcode.cn/problems/sliding-window-maximum/description/

本题的题意是说有一个大小为k的滑动窗口,每次会向右移动一格,求每移动一次时滑动窗口内的元素最大值,将这个最大值加入一个数组中,然后返回这个数组。
我们可以通过一个双端队列deque来实现滑动窗口的效果,即尾进头出。
首先我们定义一个动态数组ans用来存储结果,一个双端队列a来实现滑动窗口,接着进入循环。
在循环内部,使用if(!a.empty()&&a.front()==i-k){ a.pop_front(); }来移除队列前端的索引已经不在当前窗口范围内的元素,即过期元素。然后是在将当前元素加入队列之前,移除队列中所有小于当前元素的索引,以确保队列中的元素始终按照从大到小的顺序排列。当窗口形成,将队列前端的元素加入结果数组 ans。

ac代码
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque <int> a;
        vector <int> ans;
        for(int i=0;i<nums.size();i++){
            if(!a.empty()&&a.front()==i-k){
                a.pop_front();
            }
            while(!a.empty()&&nums[a.back()]<nums[i]) {
                a.pop_back();
            }
            a.push_back(i);
            if(i>=k-1) ans.push_back(nums[a.front()]);
        }
        return ans;
    }
};
posted @ 2025-02-24 17:26  扶风zer0  阅读(23)  评论(0)    收藏  举报