陣列左邊和右邊離i最近的比arr[i]小的位置
阿新 • • 發佈:2021-10-13
連結
給定一個可能含有重複值的陣列 arr,找到每一個 i 位置左邊和右邊離 i 位置最近且值比 arr[i] 小的位置。返回所有位置相應的資訊。
心之所向,素履以往 生如逆旅,一葦以航import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.util.Stack; public class Main { private static final StreamTokenizer TOKENIZER = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); private static int nextInt() { try { TOKENIZER.nextToken(); } catch (IOException e) { e.printStackTrace(); } return (int) TOKENIZER.nval; } private static int[][] solve(int[] arr) { int n = arr.length; int[][] ret = new int[n][2]; Stack<Integer> stack = new Stack<>(); for (int i = 0; i < n; ++i) { while (!stack.isEmpty() && arr[stack.peek()] > arr[i]) { ret[stack.pop()][1] = i; } ret[i][0] = stack.isEmpty() ? -1 : (arr[i] == arr[stack.peek()] ? ret[stack.peek()][0] : stack.peek()); stack.push(i); } while (!stack.isEmpty()) { ret[stack.pop()][1] = -1; } return ret; } private static void print(int[][] ret) { StringBuilder sb = new StringBuilder(); for (int[] item : ret) { sb.append(item[0]).append(" ").append(item[1]).append("\n"); } System.out.println(sb); } public static void main(String[] args) { int n = nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; ++i) { arr[i] = nextInt(); } int[][] ret = solve(arr); print(ret); } }