zoukankan      html  css  js  c++  java
  • 【基础算法】单调栈

    给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。

    输入格式

    第一行包含整数N,表示数列长度。

    第二行包含N个整数,表示整数数列。

    输出格式

    共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。

    数据范围

    1N1051≤N≤105
    11091≤数列中元素≤109

    输入样例:

    5
    3 4 2 7 5
    

    输出样例:

    -1 3 -1 2 2



    个人理解:

    这个题首先用朴素写法先写出一个大概的框架,两个for循环,一个向后访问,一个向前寻找小于他的 数字。

    然后进行优化,第二重循环里面有没有根本就用不到的值呢?当我们的a[i] >= a[j] ,i < j 的时候,a[i]根本就用不到了,因为如果选了a[i]必定可以选a[j] 所以a[i]可以去掉,去掉之后,就会发现我们的数组中的值是单调递增的,也就形成了我们的单调栈算法。

    代码:

    #include<iostream>
    using namespace std;
    
    const int N = 100010;
    int stk[N], tt;
    
    int main() {
        int n, x;
        cin >> n;
        for (int i = 0;i < n;i++) {
            cin >> x;
            
            while (tt && stk[tt] >= x) tt--;
            if (tt) cout << stk[tt] << ' ';
            else cout << -1 << ' ';
    
            stk[++tt] = x;
        }
        return 0;
    }
  • 相关阅读:
    myeclipse安装
    win下Velocity安装和试用
    win下Java环境安装
    零基础编程指南(By Turtle)
    快速将某个文件夹下的所有文件中的匹配数据替换
    补丁数组(增删改查都较快的数组)
    addView的误区
    NOIP普及组:买铅笔
    由抽奖软件想到的随机算法总结
    Codeforces Round #220 (Div. 2) 解题报告
  • 原文地址:https://www.cnblogs.com/Attacking-vincent/p/12980998.html
Copyright © 2011-2022 走看看