题目:滑动窗口的最大值
要求:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。具体见下例:
例如,数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};
6个滑动窗口如下:
{[2,3,4],2,6,2,5,1},最大值 4
{2,[3,4,2],6,2,5,1},最大值 4
{2,3,[4,2,6],2,5,1},最大值 6
{2,3,4,[2,6,2],5,1},最大值 6
{2,3,4,2,[6,2,5],1},最大值 6
{2,3,4,2,6,[2,5,1]},最大值 5
class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { } };
解题代码:
class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { // 处理边界情况 vector<int> res; if(size == 0 || size > num.size()) return res; if(size == 1) return num; deque<int> window; // 为了后续使用,window存储下标 for(unsigned int i = 0; i < size; i++){ while(!window.empty() && num[i] >= num[window.back()]) window.pop_back(); window.push_back(i); } // 完成初次装载 res.push_back(num[window.front()]); // 从下标为size处继续执行 for(unsigned int i = size; i < num.size(); i++){ // 检查window里面的元素是否滑出窗口 if(!(window.front() >= i-size+1 && window.front() <= i)) window.pop_front(); // 执行比较与替换 while(!window.empty() && num[i] >= num[window.back()]) window.pop_back(); window.push_back(i); res.push_back(num[window.front()]); } return res; } };