题解 | #滑动窗口的最大值#

滑动窗口的最大值

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> temp;
        int index[100010];
        int wsize = size;
        if (size == 0 || size > num.size()) return temp;

        int hh = 0, tt = -1;
        for (int i = 0; i < num.size(); i ++)
        {
            if (hh <= tt && i - wsize + 1 > index[hh]) hh ++;
            cout << hh << ' ';
            while (hh <= tt && num[index[tt]] <= num[i]) tt --;
            index[ ++ tt] = i;
		  
            if (i - wsize + 1 >= 0)
            {
                temp.push_back(num[index[hh]]);
            }
        }
        return temp;
    }
};

通过index数组记录下标。index数组队头是最大值,这个下标数组包含了原数组降序排列的下标。所以队头是最大值,当窗口滑出,hh ++,原来第二大的值变成目前窗口内最大值。此时会有新元素加入窗口,因为index是降序,所以队尾是最小的,如果队尾没有新元素大,那么tt--,把它移出,循环会把目前队列中所有不比新元素大的值都移出。因为他们在不在队列里已经没有用了,新元素很大,说明直到窗口从刚框入新元素直到滑出新元素的范围内,新元素一直在,此时最大值一定不会是之前比新元素小的数字。

第一要在开始的时候判断窗口是否需要滑动,第二要在最后判断目前是否构成一个完整的窗口,然后才能输出。

全部评论

相关推荐

是每个人事都这样与找工作的人这样沟通吗?正常询问不可以吗
超时空记忆丶:这种人适合跟我聊 我能骂得她心里难受一天,这种byd一看就是欠骂,这么好的机会楼主别错过。
点赞 评论 收藏
分享
05-25 10:45
门头沟学院 Java
Frank_zhang:没实习一个项目肯定不够,可以再做一个轮子,技术栈再补一个mq,微服务,整体再换个简历模板,暑期尽量再找一个日常实习
点赞 评论 收藏
分享
在瑞幸干两年,奥特曼都得闪灯
不知名的牛友:奥特曼每天只上3分钟班
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务