剑指offer 47.滑动窗口的最大值

  1. 题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
  2. 思路:
    1. 暴力法,两层循环,找到窗口的最大值
  3. 启发或者坑:
    1. 如果窗口大小k接近于n,那这个复杂度可能是n*2
  4. 代码:
    class Solution {
    public:
        vector<int> maxInWindows(const vector<int>& num, unsigned int size)
        {
            //用栈实现队列,需要两个栈,每次2k的复杂度,插入和删除
            //比如栈2,3,4,插入就是2,3,4,2,然后需要删除借助两个栈2,3,4,2,变成2,4,3,2,pop2,然后换到另外一个栈3,4,2
            //对于这个题目而言,插入栈元素(如果栈没满,直接更新栈内最大值;如果栈到size,用两个栈先进先出顺便更新最大值),时间复杂度nk
            //如果直接每次遍历窗口大小也是k
             
           vector<int> res;
            int maxV;
            if (size == 0)
                return res;
            if (num.size() == 0)
                return res;
            if (num.size() < size) {
                /*maxV = num[0];
                for (int j = 0; j < num.size(); j++) {
                    if (num[j] > maxV)
                        maxV = num[j];
                }
                res.push_back(maxV);*/
                return res;
            }
            for (int i = 0; i <= num.size()-size; i++) {
                maxV = num[i];
                for (int j = 0; j < size; j++) {
                    if (num[i+j] > maxV)
                        maxV = num[i+j];
                }
                res.push_back(maxV);
            }
            return res;
        }
    };
发布了131 篇原创文章 · 获赞 5 · 访问量 7379

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/104093211