牛客单调栈结构(进阶)

Problem: 单调栈结构(进阶)

文章目录

思路

这是一个单调栈的问题。单调栈是一种特殊的栈结构,它的特点是栈中的元素保持单调性。在这个问题中,我们需要找到每个元素左边和右边第一个比它小的元素。我们可以使用一个单调递减的栈来解决这个问题。

我们从左到右遍历数组,对于每个元素,我们将其与栈顶元素进行比较。如果当前元素小于栈顶元素,那么我们就找到了栈顶元素右边第一个比它小的元素,我们可以将栈顶元素出栈,并记录下这个信息。然后我们继续将当前元素与新的栈顶元素进行比较,直到当前元素大于栈顶元素或者栈为空,然后我们将当前元素入栈。

在遍历结束后,栈中可能还会剩下一些元素,这些元素右边没有比它们小的元素,我们可以将它们出栈,并记录下这个信息。

最后,我们需要处理一下相等的情况。如果一个元素右边第一个比它小的元素和它相等,那么我们需要找到右边第一个不等于它的元素。

解题方法

我们使用一个栈和一个二维数组来解决这个问题。栈用来存储元素的索引,二维数组用来存储每个元素左边和右边第一个比它小的元素的索引。

复杂度

时间复杂度:

O ( n ) O(n) O(n),我们只需要遍历一次数组。

空间复杂度:

O ( n ) O(n) O(n),我们需要一个栈和一个二维数组来存储信息。

Code

java 复制代码
import java.util.*;
import java.io.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static StreamTokenizer sr = new StreamTokenizer(in);
    static int MAXN = 1000010;
    static int n, r;
    static int[] stack = new int[MAXN];
    static int[][] ans = new int[MAXN][2];
    static int[] arr = new int[MAXN];
    public static void main(String[] args) throws IOException {
        n = nextInt();
        for (int i = 0; i < n; i++) {
            arr[i] = nextInt();
        }
        deal();
        for (int i = 0; i < n; i++) {
            out.println(ans[i][0] + " " + ans[i][1]);
        }
        out.flush();

    }

    private static void deal() {
        r = 0;
        int cur;
        for (int i = 0; i < n; i++) {
            while (r > 0 && arr[stack[r - 1]] >= arr[i]) {
                cur = stack[--r];
                ans[cur][0] = r > 0 ? stack[r - 1] : -1;
                ans[cur][1] = i;
            }
            stack[r++] = i;
        }

        while (r > 0) {
            cur = stack[--r];
            ans[cur][0] = r > 0 ? stack[r - 1] : -1;
            ans[cur][1] = -1;
        }

        for (int i = n - 2; i >= 0; i--) {
			if (ans[i][1] != -1 && arr[ans[i][1]] == arr[i]) {
				ans[i][1] = ans[ans[i][1]][1];
			}
		}
    }
    static int nextInt() throws IOException {
        sr.nextToken();
        return (int)sr.nval;
    }
}
相关推荐
戇居11 天前
LeetCode 热题100 --双指针
java·算法·leetcode·面试·双指针·单调栈·接雨水
一米八五羊毛菌21 天前
【单调栈算法题记录】739. 每日温度
数据结构·c++·算法·leetcode·单调栈
炫酷的伊莉娜1 个月前
【错题集-编程题】小红取数(动态规划 - 01 背包 + 同余)
算法·动态规划·01背包·牛客·同余·错题
炫酷的伊莉娜1 个月前
【错题集-编程题】kotori 和迷宫(BFS / DFS)
算法·深度优先·dfs·bfs·宽度优先·牛客·错题
炫酷的伊莉娜2 个月前
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
算法·模拟·排序·牛客·错题
OrangeEarth2 个月前
刷题DAY60 | LeetCode 84-柱状图中最大的矩形
c++·算法·leetcode·职场和发展·刷题·双指针·单调栈
卡布叻_周深3 个月前
后缀数组 学习笔记
字符串·双指针·单调栈·并查集·st表·单调队列·后缀数组·分块与莫队
Utozyz3 个月前
NC20128 不重复数字
数据结构·c++·算法·刷题·牛客网·牛客
Utozyz3 个月前
NC13610 矩阵
数据结构·c++·算法·矩阵·刷题·牛客·字符哈希
UestcXiye3 个月前
Leetcode11. 盛最多水的容器
c++·双指针·单调栈·数据结构与算法