https://leetcode-cn.com/problems/sliding-window-maximum/
AC1
模拟,暴力152ms
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int>ans;
if(nums.empty())
return ans;
list<int> window;
list<int>::iterator it;
for (int j = 0; j < k; ++j) {
window.push_back(nums[j]);
}
for (int i = k; i <= nums.size(); ++i) {
//查找最大值
it = max_element(window.begin(),window.end());
//添加至ans
ans.push_back(*it);
window.erase(window.begin());
window.push_back(nums[i]);
}
return ans;
}
};
AC2
56ms
每隔k个求一次最大值,就是优化求最大值的地方。当前最大值没有出窗口时,只需要比较新插入的值与最大值。
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int>ans;
if(nums.empty())
return ans;
list<int> window;
list<int>::iterator it;
for (int j = 0; j < k; ++j) {
window.push_back(nums[j]);
}
//查找最大值
it = max_element(window.begin(),window.end());
int index =distance(window.begin(),it);
//添加至ans
ans.push_back(*it);
for (int i = k; i < nums.size(); ++i) {
window.erase(window.begin());
window.push_back(nums[i]);
index--;
if(index<0){//出窗口
it = max_element(window.begin(),window.end());
index =distance(window.begin(),it);
ans.push_back(*it);
} else{//未出窗口
if(nums[i]>(*it)){//新入的大于原最大值
index = k-1;//更新最大值位置
ans.push_back(nums[i]);
it = --window.end();//更新window最大值迭代器的指向,更新为最后一个
} else{
ans.push_back(*it);
}
}
}
return ans;
}