1. 程式人生 > 其它 >陣列左邊和右邊離i最近的比arr[i]小的位置

陣列左邊和右邊離i最近的比arr[i]小的位置

連結
給定一個可能含有重複值的陣列 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);
    }
}
心之所向,素履以往 生如逆旅,一葦以航