单调队列算法总结
创始人
2024-03-23 20:02:36
0

背景

单调队列,即为单调递减或者单调递增的队列。队列中的元素只能在队尾入队、从队首或者队尾出队。

单调队列的基本实现就是维护一个双向队列,只有当一个元素是当前最值、或者可能成为最值时才保留,否则出队。

单调队列通常用来解决在滑动区间中求最值的问题。

单调队列算法原理

①.单调队列原理

单调队列队列的核心思想就是:资历再老的人也得给有能力的年轻人让位。

假设有一个江湖门派:每个人最多在门派中待 5 年、同时每年都会有一个新成员加入。门派中能力最高(能力用数字表示)的人为当年的掌门,同时要培养未来的掌门人,掌门及未来掌门构成了门派的核心成员。

在这里插入图片描述

如上图所示,门派中核心成员小组人员维护规则如下:

满期限的成员必须从核心小组中退出;

新成员代表着未来必须加入核心小组;

若核心中的老成员能力比新成员小则直接出局。

②.代码表示

vector v;//依次加入的成员
deque dq;//双向队列、存储下标
int size = v.size();
for( int i = 0;i < size;++i)
{while(!dq.empty() && i - dq.front() >= k )dq.pop_front();// 超年限的成员、必须让位while(!dq.empty() && v[dq.back()] < v[i])dq.pop_back();// 老成员能力比新成员小则直接出局dq.push_back(i);// 新成员一定入队       
}

应用举例

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。

力扣(LeetCode)第239道题

本题要求滑动窗口中的最大值,可以采用单调队列算法,套用其基本规则即可:

class Solution {
public:vector maxSlidingWindow(vector& nums, int k) {vector res;deque myqueue;//双端队列,保存下标int size = nums.size();for( int i = 0; i < size;i++){while( !myqueue.empty() &&  i - myqueue.front() >= k)myqueue.pop_front();//超出窗口范围的元素、删除while( !myqueue.empty() && nums[myqueue.back()] < nums[i])myqueue.pop_back();//末尾元素小于当前值、删除myqueue.push_back(i);//加到末尾  if( i >= k-1 ){res.push_back(nums[myqueue.front()]);}           }return res;}
};

在这里插入图片描述

相关内容

热门资讯

流动摊贩违规添加食品添加剂,公... 极目新闻通讯员 王粲 以公开促公正、以听证赢公信,近日,湖北省团风县检察院就甄某销售不合格食品行政公...
浙江义乌首创商会退出机制 制度... 中新网义乌12月27日电 题:浙江义乌首创商会退出机制 制度化探索获全国推广 作者 董易鑫 “我们正...
《办法》:建立身份透明制度,划... 专家解读|促进人工智能拟人化互动服务有序开展引领人工智能负责任创新 人工智能技术的突破正推动人机交互...
探寻强制执行律师服务,周云卿律... 在法律纠纷中,胜诉只是第一步,真正实现权益落地,强制执行环节至关重要。那么,强制执行律师服务哪家强?...
李宏毅直播称活动因不可抗力取消... 12月25日,艺人李宏毅因与芒果娱乐的经纪合同纠纷,被法院执行约1118万元款项,同时收到限制消费令...
法援故事|法援“撑腰”!13名... 绿色通道,法援接单 春节前,农民工们多次向县住建局清欠办反映情况,在工作人员协调下,郭某某给部分人出...
山西黄河壶口瀑布旅游区推出免门... 公众号转载山西经济日报稿件,须申请授权。 山西黄河壶口瀑布旅游区日前发布消息,从12月下旬至明年2...
吉利汽车旗下公司起诉知名电池企... 欣旺达(SZ300207)子公司欣旺达动力科技股份有限公司(以下简称欣旺达动力)卷入了一场高达23....
备案审查成效显著 全国人大常委... 每经记者|李彪 每经编辑|黄博文 12月24日,全国人大常委会法工委(以下简称“法工委”)法规备案...