下一个更大元素 II

时间复杂度O(n^2)

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int[] res = new int[nums.length];
        int top = 0;
        
        for(int i=0;i<nums.length;i++){
            boolean flag = false; 
            for(int j=(i+1)%nums.length;j!=i;j=(j+1)%nums.length){
                if(nums[j] > nums[i]){
                    flag = true;
                    res[top++] = nums[j];
                    break; 
                }
            }
            if(!flag) res[top++] = -1;
        }
        return res;
    }
}

单调栈:时间复杂度O(n)

栈内存储的是单调不递增的数组下标,当指向元素大于栈顶对应的数组元素,出栈并且结果数组对应的位置赋值为指向元素。

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int numsLen = nums.length;
        int[] res = new int[numsLen];
        Arrays.fill(res,-1);
        Stack<Integer> stk = new Stack<>();//存储的是单调不递增数组的index(栈底到栈顶)
        for(int i=0;i<numsLen*2;i++){//循环两遍相当于循环数组遍历
            int num = nums[i%numsLen];
            while(!stk.isEmpty() && nums[stk.peek()] < num){
                res[stk.pop()] = num;
            }
            if(i < numsLen) stk.add(i);//小于n才有存储的必要
        }
        return res;

        
    }
}

原文地址:https://www.cnblogs.com/cstdio1/p/13423114.html