单调栈算法 入门+博客推荐+模板

单调栈算法 入门+博客推荐+模板

博客推荐

用法及作用:https://www.cnblogs.com/lher/p/7620330.html

简介

首先需要明确定义:1.单调递增的栈,2.单调递减的栈

  1. 单调递增的栈:从栈顶到栈底是递增的,每次压进去的数要小于栈顶元素,输出也是单调递增的,主要是解决最大值的区间问题;
  2. 单调递减的栈:从栈顶到栈底是递减的,每次压进去的数要大于栈顶元素,输出也是单调递减的,主要是解决最小值的区间问题;

这里的单调性是否严格,要根据实际情况来做决定。

在一个数列中,单调栈解决的是以某个值为最小(最大)值的最大区间,也就是我们需要知道当以这个值为最小值时,在这个数列中的左右区间是什么。

模板

//求最小值时的区间,使用单调递减栈
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const double esp=1e-6;
const int inf=0x3f3f3f3f;
const int MAXN=1E5+7;
ll num[MAXN], st[MAXN];
int n, top, lt[MAXN], rt[MAXN];
int main()
{
    //这里是求正数数列的
    while(scanf("%d",&n) && n!=0)
    {
        top=0; st[top]=0; //预处理
        num[0]=-1; num[n+1]=-1;//预处理,因为输入的数都是正数,所以这个是最小的数
        for(int i=1; i<=n; i++)
            scanf("%lld", &num[i]);
        for(int i=1; i<=n+1; i++)//这里多一个是为了全部输出
        {
            lt[i]=i;
            rt[i]=i;
            while(num[st[top]] > num[i]) //栈顶元素大于要进栈的数
            {
                rt[st[top]] = i-1;
                lt[i] = lt[st[top]];
                top--;
            }
            if(num[st[top]] == num[i]) lt[i] = lt[st[top]];//很重要的,很巧妙的代码
            st[++top]=i;//大于等于栈顶的数进栈。
        }
        for(int i=1; i<=n; i++)
            printf("%d %d\n", lt[i], rt[i]);
    }
    return 0;
}
//求最大值时的区间,使用单调递增栈,小于等于栈顶的数进栈
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const double esp=1e-6;
const int inf=0x3f3f3f3f;
const int MAXN=1E5+7;
ll num[MAXN], st[MAXN];
int n, top, lt[MAXN], rt[MAXN];
int main()
{
    while(scanf("%d",&n) &&n!=0)
    {
        top=0; st[top]=0;
        num[0]=-1; num[n+1]=-1;
        for(int i=1; i<=n; i++)
            scanf("%d", &num[i]);
        for(int i=1; i<=n+1; i++)
        {
            lt[i]=i;
            rt[i]=i;
            while(num[st[top]] < num[i])
            {
                rt[st[top]]=i-1;
                lt[i]=lt[st[top]];
                top--;
            }
            if(num[st[top]] == num[i])
                lt[i] = lt[st[top]];
            st[++top]=i;
        }
        for(int i=1; i<=n; i++)
            print("%d %d\n", lt[i], rt[i]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/alking1001/p/12299121.html

时间: 2024-10-06 02:12:33

单调栈算法 入门+博客推荐+模板的相关文章

KMP入门 博客推荐+模板+入门习题

KMP入门 入门介绍 KMP入门博客推荐 next数组讲解 模板代码 //这个是对next进行的优化 void getnext() //做的第一步是获得next[]的值 { int i=0,k=-1; next[0]=-1; while(i<lenb) { if(k==-1 || str[i]==str[k]) { i++; k++; if(t[i]==t[k]) next[i]=next[k]; else next[i]=k; } else k=next[k]; } } //没有带优化的部分

我的Android进阶之旅------&gt;经典的大牛博客推荐(排名不分先后)!!

本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队谦虚的天下 - 博客园gundumw100博客 - android进阶分类文章列表 - ITeye技术网站CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯Android笔

cnBlogs博客推荐

数据结构和算法若可以称为为编程的细胞结构,那设计模式就是编程的灵魂气脉. 一个从是编程的微观演绎,一个是编程的宏观设计.这个从技术和艺术的结合体,毫无疑问是在世界末日之前的很伟大的一项发明. 设计模式书籍推荐:                  <设计模式 可复用面向对象软件的基础>:将可重用面向对象的设计模型分为创造类.结构类 .行为类三种进行详述.            <软件秘笈──设计模式那点事> :模式实现通过Eclipse中的Java 工程展开,采用软件编程诠释设计模式

分享3一个博客HTML5模板

1.材类别:半透明 博客html模板 个人博客 半透明html5博客主题,半透明,博客,博客html模板,个人博客,html5,灰色,半透明html5博客主题是一款适合用于个人博客主题,风格非常不错. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHNxZHM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 半透明html5博客主题 2.素材

Bootstrap3实现的响应式幻灯滑动效果个人作品集/博客网站模板

在线演示 本地下载 相关的开发和使用说明,请参考如下课程: Bootstrap3开发滑动风格的博客网站模板

nodejs环境 + 入门 + 博客搭建

NodeJS:NodeJS是一个使用了Google高性能V8 引擎 的服务器端JavaScript实现.它提供了一个(几乎)完全非阻塞I/O栈,与JavaScript提供的闭包和匿名函数相结合,使之成为编写高吞吐 量网络服务程序的优秀平台. NPM:全称是Node Package Manager,是一个NodeJS定制的包管理和分发工具,如node-mysql,已经成为了非官方的发布Node模块(包)的标准. (npm类似maven,package.json类似pom.xml文件) mongod

物联网博客推荐:网昱多媒体

这个网站有很多关于Arduino入门的东西,同时这个博客的作者也是知名Arduino入门图书(算是吧)<完美图解Arduino互动设计入门>(台湾版<超圖解Arduino互動設計>)的作者,该图书受到Arduino官方的推荐.目前大陆上最新版为第二版,第三版现已面世,但是只有繁体中文版(作者是台湾人) <完美图解Arduino互动设计入门>第二版链接:https://detail.tmall.com/item.htm?spm=a230r.1.14.29.1f77156c

我看过的好博客推荐(javaScript+Css)

1.JavaScript秘密花园 很不错的一篇博客,讲了许多javaScript常用到的需要注意的问题,比较透彻,推荐~~ 2.经验分享:CSS浮动(float,clear)通俗讲解 http://www.cnblogs.com/lizijie/p/4046938.html http://www.iyunlu.com/view/css-xhtml/55.html http://www.cnblogs.com/polk6/archive/2013/07/25/3142187.html有些乱,有空整

CSS3的若干炒鸡有用细节和具体博客推荐

1.弹性盒子 从最初的使用table布局,当然了,现在某些表格展示的数据最好还是利用table布局, 到使用div+css布局,嗯,很大的一次进步,对于比较复杂的,div就显得力不从心了, 因此现在又有了flex布局! 今年挺火的的grid布局也接踵而至,不过呢貌似除了谷歌,大多数浏览器还没支持 . 想学习flex布局的话,推荐阮老师的博客 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 另外附上flex小书签一份~具体的用法阮老