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;
    }
  • 相关阅读:
    软件文档管理指南GB/T 16680—1996
    软件工程-产品质量
    中间件
    风险应对策略
    激励理论
    风险识别方法
    winform与js互操作
    训练报告 (2014-2015) 2014, Samara SAU ACM ICPC Quarterfinal Qualification Contest
    专题:DP杂题1
    18春季训练01-3/11 2015 ACM Amman Collegiate Programming Contest
  • 原文地址:https://www.cnblogs.com/Attacking-vincent/p/12980998.html
Copyright © 2011-2022 走看看