原创博文,转载请注明出处!
# 题目
# 思路
利用C++中的双端队列保存有可能是滑动窗口最大值的下标,其中队首元素保存当前窗口最大值的下标。当滑动窗口改变时,更新队列。队列更新的规则:(1)新元素依次与队尾元素比较,如果队尾元素小于新元素,则删除队尾元素,直至队列中没有小于新元素的值。(2)更新队首元素,如果队首元素不在新滑动窗口中,则删除队首元素。(3)把每次滑动的数字的下标压入队列
找出数组中大小为3的滑动窗口的最大值,在队列中的下标一列,小括号前面的数字表示数字在数组中的下标。
# 代码
1 #include2 #include 3 #include 4 using namespace std; 5 6 class Solution { 7 public: 8 vector maxInWindows(const vector & num, unsigned int size) 9 { 10 vector res; // 存储每个滑动窗口的最大值 11 deque s; // 保存滑动窗口最大值数字的下标 12 13 for(unsigned int i=0;i size) 21 s.pop_front(); 22 23 // 更新队列:新元素的下标加入队列 24 s.push_back(i); 25 26 // 存储结果 27 if(size&&i+1>=size) 28 res.push_back(num[s.front()]); 29 } 30 return res; 31 } 32 }; 33 int main() 34 { 35 unsigned int size = 3; 36 const vector num = {1,2,3,4,5,6,7,8,9}; 37 38 Solution solution; 39 solution.maxInWindows(num,size); 40 return 0; 41 } 42
# 复杂度
O(n)
# 测试用例