题解:AcWing 830 单调栈

【题目来源】

AcWing:830. 单调栈 - AcWing题库

【题目描述】

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

【输入】

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

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

【输出】

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

【输入样例】

5
3 4 2 7 5

【输出样例】

-1 3 -1 2 2

【解题思路】

image

【算法标签】

《AcWing 830 单调栈》 #单调栈#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;  // 定义数组最大长度

int n;          // 输入数字的个数
int stk[N], tt;  // stk: 模拟栈的数组, tt: 栈顶指针

int main()
{
    cin >> n;  // 输入数字个数
  
    for (int i = 0; i < n; i++) 
    {
        int x; 
        cin >> x;  // 输入当前数字
      
        // 维护单调递增栈:弹出所有大于等于当前元素的栈顶元素
        while (tt && stk[tt] >= x) 
            tt--;
      
        // 如果栈不为空,输出栈顶元素(即左边第一个比x小的数)
        if (tt) 
            cout << stk[tt] << " ";
        else 
            cout << -1 << " ";  // 栈为空输出-1
      
        // 将当前元素压入栈
        stk[++tt] = x;
    }
  
    return 0;
}
// 通过洛谷题目,修正模板
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;  // 定义数组最大长度

int n;          // 元素个数
int a[N];       // 存储输入数组
int ans[N];     // 存储结果数组
int stk[N];     // 单调栈(存储下标)
int tt;         // 栈顶指针

int main()
{
    cin >> n;  // 输入元素个数
  
    // 输入数组元素
    for (int i = 1; i <= n; i++) 
        cin >> a[i];
  
    // 使用单调栈处理每个元素
    for (int i = 1; i <= n; i++)
    {
        // 维护单调递增栈:弹出所有大于等于当前元素的栈顶元素
        while (tt && a[stk[tt]] >= a[i]) 
            tt--;
      
        // 如果栈不为空,当前元素左边第一个比它小的元素就是栈顶元素
        if (tt) 
            ans[i] = a[stk[tt]];
        else 
            ans[i] = -1;  // 栈为空表示左边没有更小的元素
      
        // 将当前元素的下标压入栈
        stk[++tt] = i; 
    }
  
    // 输出结果
    for (int i = 1; i <= n; i++) 
        cout << ans[i] << " ";
    cout << endl;
  
    return 0;
}

【运行结果】

5
3 4 2 7 5
-1 3 -1 2 2 
posted @ 2026-02-21 19:32  团爸讲算法  阅读(6)  评论(0)    收藏  举报