当前位置: 首页 > article >正文

单调栈、单调队列

单调栈

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+9;
ll a[N];
ll l[N];
int main()
{
  int n;cin>>n;
  for(int i=1;i<=n;i++)cin>>a[i];
  stack<int>stk;
  for(int i=1;i<=n;i++)
  {
      while(stk.size()&&stk.top()>=a[i])stk.pop();//如果前边的数比后边要加进来的数大或等于,就出栈
      if(stk.empty())l[i]=-1;//栈空说明没有比要加进来的数小的数
      else
      {
        l[i]=stk.top();//如果栈不为空,说明栈顶元素就是第一个比要加进来数小的数
      }
      stk.push(a[i]);//将数入栈
  }
  for(int i=1;i<=n;i++)
  {
    cout<<l[i]<<' ';
  }
 
  return 0;
}

单调队列

                           

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+9;
ll a[N];
int main()
{
   int n,k;cin>>n>>k;
   for(int i=1;i<=n;i++)cin>>a[i];
   //构造deque队列
   //以i为右端点[i-k+1,i]
   deque<int>dq;
   for(int i=1;i<=n;i++)
   {
      //判断队头合法性
      while(dq.size()&&dq.front()<=i-k)dq.pop_front();//判断队头元素是否在当前滑动窗口内,如果不在,则将队头元素弹出。
      //判断队尾优越性
      while(dq.size()&&a[dq.back()]<=a[i])dq.pop_back();//维护队列的单调性,若队尾元素小于等于当前元素,则将队尾元素弹出。
      dq.push_back(i);
      if(i>=k)cout<<a[dq.front()]<<' ';
   }
   cout<<'\n';
   //清空容器
   while(dq.size())
   {
      dq.pop_front();
   }
   //求最小值
   for(int i=1;i<=n;i++)
   {
      while(dq.size()&&dq.front()<=i-k)dq.pop_front();
      while(dq.size()&&a[dq.back()]>a[i])dq.pop_back();
      dq.push_back(i);
      if(i>=k)cout<<a[dq.front()]<<' ';
   }
   
    return 0;
}


http://www.kler.cn/a/579877.html

相关文章:

  • 每天一道算法题【蓝桥杯】【四数之和】
  • 李沐《动手学深度学习》——14.9. 用于预训练BERT的数据集——wiki数据集问题以及存在的其他问题
  • 基于一致性哈希的分布式Top-K
  • 基于Flink SQL的实时指标多维分析模型
  • python办公自动化--数据可视化(pandas+matplotlib)--生成条形图和饼状图
  • Spring MVC 全面解析
  • 第六次CCF-CSP认证(含C++源码)
  • Elasticsearch 入门教学:从零开始掌握分布式搜索引擎
  • ESP32的IDF开发学习-移植lvgl并显示简单ui(以gc9a01为例)
  • 内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射
  • 蓝桥杯备考:离散化详解
  • 数据结构:有序表的插入
  • MongoD和关系型数据库相关概念的对应
  • PyTorch 张量数据类型定义和转换
  • 【Linux内核系列】:深入理解缓冲区
  • 在ubuntu 24 命令行 下,制作无人值守ubuntu-24.04.2-desktop 桌面版安装U盘
  • 《深入理解Linux:高效崩溃分析与实时栈回溯技巧》
  • 操作系统知识点25
  • OCR图片识别原理
  • C++:面向对象之多态(运算符重载)