Problem: 百亿富翁
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
这是一个单调栈的问题。单调栈是一种特殊的栈结构,它的特点是栈中的元素保持单调性。在这个问题中,我们需要找到每个元素左边和右边第一个比它大的元素。我们可以使用一个单调递增的栈来解决这个问题。
解题方法
我们使用一个栈和一个二维数组来解决这个问题。栈用来存储元素的索引,二维数组用来存储每个元素左边和右边第一个比它大的元素的索引。
复杂度
时间复杂度:
O ( n ) O(n) O(n),我们只需要遍历一次数组。
空间复杂度:
O ( n ) O(n) O(n),我们需要一个栈和一个二维数组来存储信息。
Code
import java.util.*;
import java.io.*;
// 1:无需package
// 2: 类名必须Main, 不可修改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 = (int)7e5 + 10;static int[] arr = new int[MAXN];static int[][] ans = new int[MAXN][2];static int[] stack = new int[MAXN];static int n, r;public static void main(String[] args) throws IOException {n = nextInt();for(int i = 1; i <= n; i++) {arr[i] = nextInt();}deal();for(int i = 1; i <= n; i++) {out.print(ans[i][0] + " ");}out.println();for(int i = 1; i <= n; i++) {out.print(ans[i][1] + " ");}out.flush();}private static void deal() {r = 0;int cur;for(int i = 1; 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 - 1; i >= 1; 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;}
}