标签:pop closed splay res click for png 遍历数组 ide
1.暴力法,思路比较简单,复杂度O(N*K)
2.用双端队列进行展示
想到双端队列的思路:只要遍历该数组,同时在双端队列的头去维护当前窗口的最大值(在遍历过程中,发现当前元素比队列中的元素大,就将原来队列中的元素祭天),在整个遍历的过程中我们再记录下每一个窗口的最大值到结果数组中。这样就是遍历数组的复杂度O(n)
假设 nums = [1,3,-1,-3,5,3,6,7],和 k = 3
(转自小浩漫画算法)
1 class Solution { 2 public: 3 vector<int> maxSlidingWindow(vector<int>& nums, int k) { 4 vector<int> res; 5 if (nums.size() == 0) 6 { 7 return res; 8 } 9 if (k == 1)//长度为1,就是自身 10 { 11 return nums; 12 } 13 deque<int> maxque; 14 maxque.push_back(nums[0]); 15 int maxk = nums[0]; 16 for (int i = 1; i < k; i++) 17 { 18 if (i == nums.size()) //万一k比nums的个数还要大 19 { 20 res.push_back(maxk); 21 return res; 22 } 23 if (maxk < nums[i]) 24 { 25 maxk = nums[i]; 26 } 27 while (!maxque.empty() && nums[i] > maxque.back())//从尾部开始把每个小于nums[i]的数去除。 28 { 29 maxque.pop_back(); 30 } 31 maxque.push_back(nums[i]); 32 } 33 34 res.push_back(maxk);//第一个窗口的最大值 35 36 for (int i = k; i < nums.size(); i++) 37 { 38 if (nums[i - k] == maxque.front())//nums[i-k]移出窗口,如果队列头是nums[i-k]就要去除掉 39 { 40 maxque.pop_front(); 41 } 42 while (!maxque.empty() && nums[i] > maxque.back())//从尾部开始把每个小于nums[i]的数去除。 43 { 44 maxque.pop_back(); 45 } 46 maxque.push_back(nums[i]); 47 res.push_back(maxque.front()); 48 } 49 return res; 50 } 51 };
标签:pop closed splay res click for png 遍历数组 ide
原文地址:https://www.cnblogs.com/nxnslc-blog/p/12494990.html