class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int idx=0;
int max_num=nums[0];
vector<int> num;
for(int i=1;i<k;i++)
{
if(nums[i]>=max_num)
{
max_num=nums[i];
idx=i;
}
}
num.emplace_back(max_num);
for(int i =1;i<=nums.size()-k;i++)
{
if(idx>=i)
{
if(nums[i+k-1]>=nums[idx])
{
max_num=nums[i+k-1];
idx=i+k-1;
}
num.emplace_back(max_num);
}else
{
max_num=nums[i];
idx=i;
for(int j=i+1;j<i+k;j++)
{
if(nums[j]>=max_num)
{
max_num=nums[j];
idx=j;
}
}
num.emplace_back(max_num);
}
}
return num;
}
};
priority_queue<int> maxHeap;//最大堆
priority_queue<int, vector<int>, greater<int>> minHeap;//最小堆
priority_queue<pair<int, int>> pq;
// push 需要传入一个已经构造好的 pair 对象
pq.push(pair<int, int>(10, 1));
pq.emplace(10, 1); // 直接传入两个参数,自动构造 pair
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n=nums.size();
priority_queue<pair<int,int>> q;
for(int i=0;i<k;i++)
{
q.emplace(nums[i],i);
}
vector<int> ans={q.top().first};
for(int i=k;i<n;i++)
{
q.emplace(nums[i],i);
while(q.top().second<=i-k)
{
q.pop();
}
ans.emplace_back(q.top().first);
}
return ans;
}
};
deque(双端队列)
- 特点:可以在两端进行插入和删除
queue(队列)
-
特点:先进先出(FIFO),只能在一端插入,另一端删除
class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { int n=nums.size(); deque<int> q; for(int i=0;i<k;++i) { while(!q.empty()&&nums[i]>=nums[q.back()]) { q.pop_back(); } q.push_back(i); } //第一个窗口最大值 vector<int> ans={nums[q.front()]}; for(int i=k;i<n;i++)//i是滑动窗口的结束位置 { while(!q.empty()&&nums[i]>=nums[q.back()]) { q.pop_back(); } q.push_back(i); while(q.front()<=i-k) { q.pop_front(); } ans.emplace_back(nums[q.front()]); } return ans; } };