likes
comments
collection
share

AcWing 830. 单调栈——算法基础课题解

作者站长头像
站长
· 阅读数 28

AcWing 830. 单调栈

题目描述

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

输入格式

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

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

输出格式

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

数据范围

1≤𝑁≤10^5,

1≤数列中元素≤10^9

输入样例

5
3 4 2 7 5

输出样例

-1 3 -1 2 2

C++

#include <iostream>

using namespace std;

const int MAX_SIZE = 100010;

long long stack[MAX_SIZE], top;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int num_elements;
    cin >> num_elements;
    while (num_elements--) {
        int current_element;
        cin >> current_element;
        while (top && stack[top] >= current_element)
            top--;
        if (!top)
            cout << "-1 ";
        else
            cout << stack[top] << " ";
        stack[++top] = current_element;
    }

    return 0;
}

Go

package main

import (
	"bufio"
	"fmt"
	"os"
)

const N int = 1e5 + 10

func main() {
	stack := make([]int64, N)
	top := 0

	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	fmt.Fscanf(reader, "%d\n", &n)
	for i := 0; i < n; i++ {
		var x int64
		fmt.Fscanf(reader, "%d", &x)
		for top > 0 && stack[top] >= x {
			top--
		}
		if top > 0 {
			fmt.Fprintf(writer, "%d ", stack[top])
		} else {
			fmt.Fprintf(writer, "-1 ")
		}
		top++
		stack[top] = x
	}
}

模板

常见模型:找出每个数左边离它最近的比它大/小的数
int tt = 0;
for (int i = 1; i <= n; i ++ )
{
    while (tt && check(stk[tt], i)) tt -- ;
    stk[ ++ tt] = i;
}
转载自:https://juejin.cn/post/7371010479865643059
评论
请登录