1. 程式人生 > >【劍指offer】滑動窗口的最大值,C++實現

【劍指offer】滑動窗口的最大值,C++實現

AD png lock -a https 大小 idt style 可能

原創博文,轉載請註明出處!

# 題目

技術分享圖片

# 思路

利用C++中的雙端隊列保存有可能是滑動窗口最大值的下標,其中隊首元素保存當前窗口最大值的下標。當滑動窗口改變時,更新隊列。隊列更新的規則:(1)新元素依次與隊尾元素比較,如果隊尾元素小於新元素,則刪除隊尾元素,直至隊列中沒有小於新元素的值。(2)更新隊首元素,如果隊首元素不在新滑動窗口中,則刪除隊首元素。(3)把每次滑動的數字的下標壓入隊列技術分享圖片

找出數組中大小為3的滑動窗口的最大值,在隊列中的下標一列,小括號前面的數字表示數字在數組中的下標。

# 代碼

技術分享圖片
  1 #include <iostream>
  2 #include <vector>
  3
#include <queue> 4 using namespace std; 5 6 class Solution { 7 public: 8 vector<int> maxInWindows(const vector<int>& num, unsigned int size) 9 { 10 vector<int> res; // 存儲每個滑動窗口的最大值 11 deque<int> s; // 保存滑動窗口最大值數字的下標 12 13 for
(unsigned int i=0;i<num.size();++i) 14 { 15 // 更新隊列:刪除小於新元素的值 16 while(s.size() && num[s.back()]<=num[i]) 17 s.pop_back(); 18 19 // 更新隊列:更新隊首元素 20 if(s.size() && i-s.front()+1>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<int> num = {1,2,3,4,5,6,7,8,9}; 37 38 Solution solution; 39 solution.maxInWindows(num,size); 40 return 0; 41 } 42
View Code

# 復雜度

O(n)

# 測試用例

【劍指offer】滑動窗口的最大值,C++實現