NC82 滑动窗口的最大值
这道题我们就正常的来想,暴力的话需要两层for循环,第二层for循环是为了找最大值的,那我我们可不可以优化一下这个找最大值的过程呢,找的时候我们不直接遍历,而是把数据使用优先队列存起来,众所周知,优先队列是用堆实现的,所以可以将复杂度由n降为log(n)。
不过我们要找的是在窗口中的值,因此我们在存放的时候也要存放一下索引下标,找的时候从优先对列头部开始找,如果最上面的不在窗口中直接丢弃,接招去队首。
因此优先对列中存放的是pair<int,int>这样的键值对。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> v;
if(size>num.size()||size==0) return v;
priority_queue<pair<int,int> > q;
for(int i=0;i<size;i++)
{
q.push(make_pair(num[i], i));
}
v.push_back(q.top().first);
for(int i=size;i<num.size();i++)
{
q.push(make_pair(num[i], i));
pair<int,int> t=q.top();
while(1)
{
if(t.second<=i&&t.second>=i-size+1) break;
q.pop();
t=q.top();
}
v.push_back(t.first);
}
return v;
}
};