照着代码随想录巧了一遍,发现了问题
先附上错误的再附上正确的代码
错误的:
class Solution {
private:
class Myqueue{
public:
deque<int> que;
void pop(int val){
if(!que.empty() && val == que.front()){
que.pop_front();
}
}
void push(int val){
while(!que.empty() && val >= que.back()){
que.pop_back();
}
que.push_back(val);
}
int front(){
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myqueue que;
vector<int> result;
for(int i = 0;i <k;i++){
que.push(nums[i]);
}
result.push_back(que.front());
for(int i = k;i <nums.size();i++){
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
};
正确的:
class Solution {
private:
class Myqueue{
public:
deque<int> que;
void pop(int val){
if(!que.empty() && val == que.front()){
que.pop_front();
}
}
void push(int val){
while(!que.empty() && val > que.back()){
que.pop_back();
}
que.push_back(val);
}
int front(){
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myqueue que;
vector<int> result;
for(int i = 0;i <k;i++){
que.push(nums[i]);
}
result.push_back(que.front());
for(int i = k;i <nums.size();i++){
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
};
我理解的错误的原因是在定义的第二个函数push里把val=que.back()放进去了,我们假设一个数列 用例[3 4 5 7 6 7 6 1 2] k=4中,当运行到元素7(下标3和下标5)时包含两个相同的最大值,如果按照之前错误的代码我把相同情况下的第一个7弹出了,那么在运行到que.pop(nums[i-k])时发现满足val =que.front(),但其实这时候弹出的是第二个7,导致在实际用例中本还应该作为两次最大值的(第二个)7提前被弹出了。