【19. 单调栈】

简介: 单调栈**用途**:主要找到每个数左边离他最近的且比它小的数在什么地方(或者找到每个数右边离他最近的且比它大的数在什么地方)

单调栈

用途:主要找到每个数左边离他最近的且比它小的数在什么地方(或者找到每个数右边离他最近的且比它大的数在什么地方)

题目

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

输入格式

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

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

输出格式

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

数据范围

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

输入样例:

5
3 4 2 7 5

输出样例:

-1 3 -1 2 2

方法一:暴力解法

for (int i = 0; i < n; i ++)
    for (int j = i - 1; j >= 0; j --)
        if (a[i] > a[j])
        {
            cout << a[j] << endl;
            break;
        }
#include <iostream>
using namespace std;
const int N = 100010;
int q[N];
int n;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++)  cin >> q[i];
    
    for (int i = 0; i < n; i ++)
    {
        int j = i - 1;
        for (; j >= 0; j --)
        {
            if (q[j] < q[i])
            {
                cout << q[j]<<" ";
                break;
            }
             
        }
        if (j < 0)
       {
         cout << "-1" <<" ";
       }
    }
    return 0;
}

方法二:优化

  • 用栈存储 i 左边的元素
  • 如果 ax >= ay,并且x < y那么ax永远不会输出,就直接可以删除。(只要有这种逆序的关系,前面的数就会被删掉,此时剩下的序列就是单调序列了)
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int stk[N], tt;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++)
    {
        int x;
        cin >> x;
        while (tt && stk[tt] >= x) tt -- ;
        if (tt) cout << stk[tt] << " ";
        else cout << "-1" << " ";
        stk[ ++ tt] = x;
        //cout << tt << endl;;
    }
    return 0;
}
目录
相关文章
|
7天前
|
存储
栈与队列练习题
栈与队列练习题
|
7天前
|
存储 索引
操作数栈的字节码指令执行分析
操作数栈的字节码指令执行分析
|
7天前
|
算法 C++
D1. Range Sorting (Easy Version)(单调栈+思维)
D1. Range Sorting (Easy Version)(单调栈+思维)
|
7天前
|
人工智能
线段树最大连续子段板子😂单调栈
线段树最大连续子段板子😂单调栈
|
7天前
数据结构第四课 -----线性表之栈
数据结构第四课 -----线性表之栈
|
7天前
|
存储
栈数据结构详解
栈(stack)是一种线性数据结构,栈中的元素只能先入后出(First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶 (top)。本文是对堆结构的通透介绍
|
8天前
|
存储 Java
数据结构奇妙旅程之栈和队列
数据结构奇妙旅程之栈和队列
|
8天前
|
算法
栈刷题记(二-用栈操作构建数组)
栈刷题记(二-用栈操作构建数组)
|
8天前
栈刷题记(一-有效的括号)
栈刷题记(一-有效的括号)
栈刷题记(一-有效的括号)
|
11天前
|
存储 JavaScript 前端开发
什么是堆?什么是栈?他们之间从区别和联系
什么是堆?什么是栈?他们之间从区别和联系
28 0