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

滑动窗口的最大值

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--,把它移出,循环会把目前队列中所有不比新元素大的值都移出。因为他们在不在队列里已经没有用了,新元素很大,说明直到窗口从刚框入新元素直到滑出新元素的范围内,新元素一直在,此时最大值一定不会是之前比新元素小的数字。

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

全部评论

相关推荐

我要娶个什么名:学长你电脑闹鬼了
点赞 评论 收藏
分享
12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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