模拟窗口滑动的过程,用一个数组来记录滑动窗口内的值,一个数组来记录最大值。每次窗口滑动都将最大值数组的队尾压入结果栈,最后返回结果栈。
这题要做出来并不难,难在追求优秀的时间复杂度和空间复杂度。感觉这个代码还有较大改进空间。欢迎讨论。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> result;
if(size == 0 || size > num.size()){
return result;
}
vector<int> que;
queue<int> max;
for(int i = 0;i < num.size();i++){
if(que.size() < size){
que.push_back(num.at(i));
if(max.empty()){
max.push(num.at(i));
}
else{
if(num.at(i) > max.back()){
max.push(num.at(i));
}
}
if(i == size - 1){
result.push_back(max.back());
}
continue;
}
else{
int front = que.front();
que.erase(que.begin());
if(front == max.front()){
max.pop();
}
que.push_back(num.at(i));
if(max.empty()){
int imax = que.front();
for(int i = 1;i < que.size();i++){
if(que.at(i) > imax){
imax = que.at(i);
}
}
max.push(imax);
}
else if(num.at(i) > max.back()){
max.push(num.at(i));
}
result.push_back(max.back());
}
}
return result;
}
};