算法刷题笔记 单调栈(C++实现)

文章目录

题目描述

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

输入格式

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

输出格式

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

数据范围

  • 1 ≤ N ≤ 10^5
  • 1 ≤ 数列中元素 ≤ 109

基本思路

  • 本题是单调栈最经典的应用情况。单调栈是指一个其中的元素是按照顺序排列的栈。
  • 基本思路为:
    • 首先构建一个空的整数类型的栈;
    • 每次读取一个数组元素,进行判定:
      • 如果此时的栈为空,则直接输出-1,然后将该元素入栈;
      • 如果此时的栈不为空,则将当前数组元素与栈顶元素比较。如果当前元素小于等于栈顶元素,则将栈顶元素出栈,然后比较当前元素和更新后的栈顶元素。重复上述过程,如果最终找到了一个比当前数组元素小的栈顶元素,则输出该栈顶元素的值;如果没有找到比当前数组小的栈顶元素(即把栈中的所有元素都出栈了,仍然没有找到),则直接输出-1 。最后,将当前的数组元素入栈。
    • 重复上述过程直到所有数组元素均输入完成。

实现代码

cpp 复制代码
#include <cstdio>
#include <stack>
using namespace std;

int main(void)
{
    int N;
    scanf("%d", &N);
    stack<int> sorted_stack;
    for(int i = 0; i < N; ++ i)
    {
        int x;
        scanf("%d", &x);
        if(sorted_stack.empty()) printf("-1 ");
        else
        {
            while(!sorted_stack.empty() && sorted_stack.top() >= x) sorted_stack.pop();
            if(sorted_stack.empty()) printf("-1 ");
            else printf("%d ", sorted_stack.top());
        }
        sorted_stack.push(x);
    }
    return 0;
}
相关推荐
rannn_11140 分钟前
【力扣hot100】链表专题|21、2、19、24、92、25
java·数据结构·算法·leetcode·链表·开发
SNAKEpc121381 小时前
OpenGL(十五)- 着色器语言GLSL
c语言·c++·线性代数·算法·矩阵·图形渲染·着色器
AI服务老曹1 小时前
AI视频分析API完整流程:设备、算法与告警接口接入指南
人工智能·算法·音视频
鹿角片ljp1 小时前
LeetCode 21. 合并两个有序链表
算法·leetcode·链表
Rabitebla1 小时前
C++11 新特性详解(一):列表初始化、initializer_list 与右值引用
java·开发语言·数据结构·c++·算法·leetcode·list
XMAIPC_Robot1 小时前
RK3588+STM32:高性能机器人运动控制解决方案,兼顾实时性与AI算力
人工智能·stm32·嵌入式硬件·算法·fpga开发·机器人·arm+fpga
天吾cc1 小时前
RTT-MQTT
网络·单片机·嵌入式硬件·算法
vivo互联网技术1 小时前
MagicBokeh:单步统一生成式框架实现真实感长焦虚化渲染 | CVPR 2026 Oral
人工智能·算法
GlueNa2SiO32 小时前
10-Docker生产环境部署与K8s入门
笔记·学习·docker·容器·kubernetes
茯苓gao2 小时前
无感FOC核心原理:没有编码器,电机如何获得转子电角度?
笔记·嵌入式硬件·学习