先提交了一版结果用二重循环超时了。我还奇怪不是【困难】吗?怎么这么简单?原来难在优化了。
cpp
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n=nums.size();
vector<int> m;
for(int i=0;i<=n-k;i++){
int max=nums[i];
for(int j=i+1;j<=k+i-1;j++){
if(nums[j]>max){
max=nums[j];
}
}
m.push_back(max);
}
return m;
}
};
然后我又学习了官方题解,大根堆的方法。学到了一个新的容器:大根堆
priority_queue<int> heap;
heap.push(9); // 放入
heap.top(); // 查看最大的数,不删除
heap.pop(); // 删除最大的数
这里面因为要判断堆顶元素下标,所以用了pair,来同时存放元素和下标。
cpp
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
priority_queue<pair<int,int>> heap;
vector<int> max;
int n=nums.size();
for(int i=0;i<n;i++){
heap.push({nums[i],i});
while((!heap.empty())&&(heap.top().second<=(i-k))){
heap.pop();
}
if(heap.size()>=k){
max.push_back(heap.top().first);
}
}
return max;
}
};