239-滑动窗口最大值

Posted nxnslc-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了239-滑动窗口最大值相关的知识,希望对你有一定的参考价值。

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 };
View Code

 

以上是关于239-滑动窗口最大值的主要内容,如果未能解决你的问题,请参考以下文章

精选力扣500题 第69题 239. 滑动窗口最大值c++/java详细题解

leetcode_239. 滑动窗口最大值

Leetcode 239.滑动窗口最大值

239. 滑动窗口最大值

leetcode 239. 滑动窗口最大值

239. 滑动窗口最大值