滑动窗口的最大值

1、题意重述

给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。

换句话说,即一个滑动窗口在数组上进行滑动,求出窗口在每个位置时对应数组中元素的最大值。

2、思路整理

使用双指针的思想:

Step1:选取两个指针,分别为l,r指针,通过l指针的位置和滑动窗口的大小,计算出r指针的位置。

alt

Step2:对l,r指针内的元素进行求最大值操作,并进行记录。

alt

Step3:将l指针右移,重复Step1和Step2的操作,最终得到答案。

alt

3、代码实现

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> ans;
        for(int l = 0; l < num.size() - size + 1; l ++ ) { //固定l指针
            int r = l + size - 1;                          //计算r指针
            int maxn = -1;
            for(int i = l; i <= r; i ++ ) maxn = max(maxn, num[i]); //求最大值
            if(maxn != -1) ans.push_back(maxn);            //保存结果
        } 
        return ans; //返回题目所需答案
    }
};

4、复杂度分析

时间复杂度:遍历数组加滑动窗口内求最大值,因此时间复杂度为O(Nk)O(Nk),其中N为数组长度,k为滑动窗口大小。

空间复杂度:使用vector ans,因此空间复杂度为O(N)O(N)