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;
    }
  • 相关阅读:
    Xamarin Forms 的一个小事故 dotNET界面
    求极限求无限数相加算法
    C# 获取鼠标位置
    入门级XML学习(三)
    DateTime 获取时间
    《人工智能的未来》经典语录
    VS编辑器 高亮消失如何恢复
    C# 获取桌面
    导出EXECL 2003正常 2007 不正常问题
    css 控制div高度自适应浏览器的高度
  • 原文地址:https://www.cnblogs.com/Attacking-vincent/p/12980998.html
Copyright © 2011-2022 走看看