建立一个大小为size的大顶堆head; 窗口i与窗口i+1的联系为,将窗口i中的第1个元素,修改为窗口i+1中的最后一个元素,即head[start+(i+size)%size]=num[i+size],然后更新堆即可,因为只改了一个位置,所以只要更新这个位置的祖先即可
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
void output(vector<int>& windows){
for(auto it:windows){
cout<<it<<" ";
}
cout<<endl;
}
void initial(int h,vector<int>& windows){
h--;
while(h){
int start=(1<<(h-1));
for(int i=0;i<(1<<(h-1));i++){
int pos=i+start;
windows[pos]=max(windows[pos*2],windows[pos*2+1]);
}
h--;
}
}
int getPos(int i,int size){
return i%size;
}
void adjust(int pos,int val,int h,vector<int>& windows){
windows[pos]=val;
while(pos!=1){
pos/=2;
windows[pos]=max(windows[pos*2],windows[pos*2+1]);
}
}
vector<int> maxInWindows(const vector<int>& nums, int size) {
int h=0;
int temp=size;
while(temp){
temp/=2;
h++;
}
h++;
cout<<h<<endl;
vector<int> windows(1<<h,0);
int start = (1<<(h-1));
for(int i=0;i<size;i++){
windows[i+start]=nums[i];
}
output(windows);
initial(h,windows);
output(windows);
vector<int> ans;
ans.emplace_back(windows[1]);
for(int i=size;i<nums.size();i++){
adjust(getPos(i,size)+start,nums[i],h,windows);
ans.emplace_back(windows[1]);
}
return ans;
//initial
}
};