【leetcode】实现一维max_pooling

思路有点像滑动窗口最大值。

对一个一维数组做核为k的max_pooling, 步长为1,并写出时间复杂度
思路:
使用一个双端队列(deque)作为辅助空间,其中内容为数组的index。

首先处理index从0到size-1(size为核长),如果deque空,直接压入当前index到队列尾部,否则对比队列尾部的index所对应的值是否小于等于当前index所对应的值,如果小于等于,则从队列尾部弹出。
其次,处理index从size到length - 1,先将队列头index所对应的值加入最终结果,然后判断当前index所对应的值是否大于等于队尾index所对应的值,如果大于等于,那么从队尾弹出。最后判断队头的index是否已经小于等于当前index-size,如果小于等于,删除队头。

时间复杂度O(n)

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        deque<int> index;
        vector<int> maxWindows;
        int length = num.size();
        if(length < int(size) || size < 1)
            return maxWindows;
        for(unsigned int i = 0; i < size; i++){
            while(!index.empty() && num[i] >= num[index.back()])
                index.pop_back();
            index.push_back(i);
        }
        for(unsigned int i = size; i < length; i++){
            maxWindows.push_back(num[index.front()]);
            while(!index.empty() && num[index.back()] <= num[i])
                index.pop_back();
            if(!index.empty() && index.front() <= int(i - size))
                index.pop_front();
            index.push_back(i);
        }
        maxWindows.push_back(num[index.front()]);
        return maxWindows;
    }
};

2019小红书算法工程师面试:二维max pooling

备忘(答辩内容):

做过述职答辩的路过答题:实习期间的主要工作和成果,以及自己对于工作部分的思考(不足和改进的建议)。总结来说:star原则+个人思考总结。

原文链接:https://blog.csdn.net/siyue0211/article/details/80959352

发布了316 篇原创文章 · 获赞 96 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_31866177/article/details/100607978