我使用的是蛮力优化了一点的版本,改进不是很大:
实时记录当前的区间的最大值跟区间索引。
第一个区间,直接获取。
后续区间:
情况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; } };