安徽网站建设案例万方网官网入口
安徽网站建设案例,万方网官网入口,网页设计尺寸大小,绿色食品网站建设可行性本题是一个经典的单调队列题。不过用优先队列也能解决。 一、优先队列 在使用优先队列时#xff0c;我们会遇到这样的问题#xff1a;如何将一个目标数从优先队列中弹出#xff1f;如果使用stl这是办不到的#xff0c;虽然可以自行实现这样的功能。但是我们可以这样思考我们会遇到这样的问题如何将一个目标数从优先队列中弹出如果使用stl这是办不到的虽然可以自行实现这样的功能。但是我们可以这样思考我们保存数的位置信息延迟出队当一个数在堆顶时判断其是否在窗口中不在窗口中则舍弃一直找到在窗口中的数。判断是否在窗口中只需要保存这个数入队时的位置信息在窗口之外则舍弃。 由于每个数进入优先对列排序 和 出优先对列 最多一次则时间复杂度为nlognn。 时间复杂度Onlogn每个数进队进行一次logn排序每个数进队出队最多一次
class Solution {
public:vectorint maxSlidingWindow(vectorint nums, int k) {priority_queuepairint,int Q;vectorint ans;for(int i0;ik;i) Q.push({nums[i],i});//这里first成员一定要是数值int lennums.size()-k;for(int i0;ilen;i){while(Q.top().secondi) Q.pop();ans.push_back(Q.top().first);Q.push({nums[ik],ik});}while(Q.top().secondlen) Q.pop();ans.push_back(Q.top().first);return ans;}
};
二、单调队列 单调队列实际上就是时刻保存一个按顺序站好队的队列这个队列的特殊性是不保存无效成员且队头一定是当前答案。一旦更能成为答案的出现了就不再保存不能成为答案的成员。 相当于n个人排成一对小明想依次记录每k个人的身高中最高的那一个。如果小明发现某次的k个人中有以个人比前面的人都高那么小明在接下来看最高的人时根本不用再记着这个人前面的人因为他们在后面不会起到作用。虽然这个人后面的人可能比较矮但可能在之后是最高的呀因此还需要记录着。对于每一个人都是如此他前面的比它矮的都没有用了因此可以维护一个双端队列在考虑某个人时这个人如果比队列后面的人高则把这些人出队接下来就不再考虑了但是队头的人一定是最高的吗 是的但是还需要看看它是否在被考虑的k个人中。 每个数入队出队最多一次不需要进行排序时间复杂度O(n) 记录身高以及位置信息
class Solution {
public:vectorint maxSlidingWindow(vectorint nums, int k) {dequepairint,int myque;int lennums.size()-k;vectorint ans;for(int i0;ik;i) {while(!myque.empty()myque.back().firstnums[i]) myque.pop_back();myque.push_back({nums[i],i});}for(int i0;ilen;i) {while(!myque.empty()myque.front().secondi) myque.pop_front();ans.push_back(myque.front().first);int tempik;while(!myque.empty()myque.back().firstnums[temp]) myque.pop_back();myque.push_back({nums[temp],temp});}while(myque.front().secondlen) myque.pop_front();ans.push_back(myque.front().first);return ans;}
};
实际上不用记录身高因为身高可以用位置信息直接得到但优先队列不一样是因为优先队列要在内部排序 class Solution {
public:vectorint maxSlidingWindow(vectorint nums, int k) {dequeint myque;int lennums.size()-k;vectorint ans;for(int i0;ik;i) {while(!myque.empty()nums[myque.back()]nums[i]) myque.pop_back();myque.push_back(i);}for(int i0;ilen;i) {while(!myque.empty()myque.front()i) myque.pop_front();ans.push_back(nums[myque.front()]);int tempik;while(!myque.empty()nums[myque.back()]nums[temp]) myque.pop_back();myque.push_back(temp);}while(myque.front()len) myque.pop_front();ans.push_back(nums[myque.front()]);return ans;}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92114.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!