数组常见问题

2021-02-21  本文已影响0人  知止9528

寻找左右两边第一个比自己大的数

public class MY_寻找左右两边第一个比它大的数 {
    public static void main(String[] args) {
        int[] nums = {3, 8, 5, 6, 9, 2, 1, 7};
        System.out.println(Arrays.toString(nums));
        printLeftAndRightFirstMax(nums);
    }

    public static void printLeftAndRightFirstMax(int[] nums) {

        int len = nums.length;
        int[] left = new int[len];
        int[] right = new int[len];
        //数据初始化
        for (int i = 0; i < len; i++) {
            left[i] = -1;
            right[i] = -1;
        }

        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < len; i++) {
            while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {
                //弹出栈内元素  并且更新右边第一个比它大的数
                right[stack.pop()] = i;
            }
            if (!stack.isEmpty() && nums[i] < nums[stack.peek()]) {
                left[i] = stack.peek();
            }
            stack.push(i);
        }

        for (int i = 0; i < nums.length; i++) {
            System.out.println("第" + i + "个数为:" + nums[i]);
            System.out.println("左边第一个比它大的数为:" + nums[left[i]==-1?i:left[i]]);
            System.out.println("右边第一个比它大的数为:" + nums[right[i]==-1?i:right[i]]);
            System.out.println("=======================");
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读