239. 滑动窗口最大值/C++

在这里插入图片描述
思路:
用一个双端队列存储在滑动窗口里的元素下标。保证队首元素是滑动窗口的最大值的下标。
当新元素进入队列时,如果队尾的元素不比新元素大,那么就将队尾元素弹出。因为该元素不如新元素大,生存能力又不如新元素强。
新元素进队后,就可以判断队头元素是否需要出队。如果出队,新的队头元素就是此时的所求。

vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        if(nums.empty() || k==0)
            return res;
        
        deque<int> que;
        
        //先处理前k个元素,此时不需要输出
        for(int i=0;i<k;++i){
        	//如果队尾元素不比新元素大,就将队尾元素弹出
            while(!que.empty() && nums[que.back()]<=nums[i])
                que.pop_back();
            que.push_back(i);
        }
        //队首元素就是此时的最大值
        res.push_back(nums[que.front()]);
        
        //处理后面的元素,每次for循环都会输出一次
        for(int i=k;i<nums.size();++i){
            while(!que.empty() && nums[que.back()]<=nums[i])
                que.pop_back();
            que.push_back(i);
            
            //如果队首元素出了窗口的范围,则弹出
            if(!que.empty() && que.front()<i-k+1)
                que.pop_front();
            res.push_back(nums[que.front()]);
        }
        
        return res;
}

猜你喜欢

转载自blog.csdn.net/Zolewit/article/details/89468147