ACM算法训练【单调栈,滑动窗口】

简介: 1.单调栈题目给定某个数列,找到每个数左边第一个比它小的数



1.单调栈


题目


给定某个数列,找到每个数左边第一个比它小的数



样例


输入样例:


5
3 4 2 7 5


输出样例:


-1 3 -1 2 2


思路


性质:如果数列栈中存在这样的关系,ax>=ayx<y那么,ax肯定不会作为答案被输出,那么ax就可以被删除

用单调递增栈,当该元素可以入栈的时候,栈顶元素就是它左侧第一个比它小的元素。



代码


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int tt;
int skt[N];
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a;
        scanf("%d",&a);
        while(tt && skt[tt]>=a) tt--;
        if(!tt) printf("-1 ");
        else printf("%d ",skt[tt]);
        skt[++tt]=a;
    }
    return 0;
}


2.滑动窗口(单调队列)


题目



输入输出数据范围



样例


输入样例:


8 3
1 3 -1 -3 5 3 6 7


输出样例:


-1 -3 -3 -3 3 3
3 3 5 5 6 7


思路


寻找单调性,拿寻找滑动窗口队列中最小值为例,当一个窗口中出现,ai>=ak且k>i时(不是单调递增),那么ai就是一个无用元素,可以进行删除,以此来维护每个队列的单调递增状态

在单调递增的队列中,队头元素就是当前窗口的最小元素

求最大值,对称来做即可


代码


#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int a[N],q[N];
int n,k;
int main()
{
    cin>>n>>k;
    int hh=0,tt=-1;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        if(i-k+1>q[hh]) ++hh;  // 解决队首出队问题
        while(hh<=tt && a[i]<=a[q[tt]]) --tt;  // 排除无用元素
        q[++tt]=i;
        if(i+1>=k) printf("%d ",a[q[hh]]);
    }
    cout<<endl;
    hh=0,tt=-1;
    for(int i=0;i<n;i++)
    {
        if(i-k+1>q[hh]) ++hh;  // 解决队首出队问题
        while(hh<=tt && a[i]>=a[q[tt]]) --tt;  // 排除无用元素
        q[++tt]=i;
        if(i+1>=k) printf("%d ",a[q[hh]]);
    }
    return 0;
}


目录
相关文章
|
10天前
|
算法
【算法】栈
栈相关算法题,供参考,附有链接地址及板书
|
10天前
|
算法
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
109 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
134 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
3月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
54 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
73 3
|
11天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
4天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。

热门文章

最新文章