我使用的是蛮力优化了一点的版本,改进不是很大:
实时记录当前的区间的最大值跟区间索引。
第一个区间,直接获取。
后续区间:
情况1: 当前值比此前最大值大,直接使用当前值跟索引。
情况2:比此前最大值小,再分情况:
情况a:此前最大值还在区间内,仍使用之前最大值跟索引
情况b:不在区间内,更新区间内最大值跟索引

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> res;
        if(num.size() < size || num.size() == 0 || size == 0){
            return res;
        }
        
        int maxVal = num[0];
        int maxIndex = 0;
        
        for(int i=1;i<size;i++){
            if(num[i] > maxVal){
                maxVal = num[i];
                maxIndex = i;
            }
        }
        
        res.push_back(maxVal);
        for(int i=size;i<num.size();i++){
            if(num[i] >= maxVal){
                maxVal = num[i];
                maxIndex = i;
                res.push_back(maxVal);
            }else{
                if(i-maxIndex == size){
                    maxVal = num[maxIndex+1];
                    maxIndex = maxIndex+1;
                    for(int j=maxIndex+1;j<i;j++){
                        if(num[j] > maxVal){
                            maxVal = num[j];
                            maxIndex = j;
                        }
                    }
                    res.push_back(maxVal);
                }else{
                    res.push_back(maxVal);
                }
            }
        }
        
        return res;
    }
};