栈 503.下一个更大的元素

题目

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

题目来源

分析

对于这类题目,有点类似于前后括号的匹配,对于前后的括号匹配,我们会使用到栈的结构,其实在这里也是一样,只不过匹配的条件不相同罢了,括号匹配要求的是符号对称,而这道题要求的是相对当前元素较大即可

故与之类似,我们也是使用栈结构来完成,另外也需要一个next数组来记录,每个元素的下一个较大的元素值,步骤如下:

按照题目要求,创建next数组并填充为-1,以为是循环数组,所以可以遍历两遍数组(2*n);若栈为空则入栈,在遍历数组的过程中判断当前元素是否大于栈顶的元素,若大于,则记录栈顶元素的下一个较大元素。否则继续遍历或入栈。

代码

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int n = nums.length;
        int[] next = new int[n];
        /*将next数组填充为-1*/
        Arrays.fill(next,-1);
        Stack<Integer> s = new Stack<>();
        for( int i = 0 ; i < 2 * n ; i++ )
        {
            int num = nums[i%n];
            /*若栈不为空且当前元素比栈顶元素大,则next数组记录栈顶元素的下一个较大的元素*/
            while( !s.isEmpty() && nums[s.peek()] < num )
            {
                next[s.pop()] = num;
            }
            /*
            *入栈
            */
            if( i < n )
            {
                s.push(i);
            }
        }
        /*返回next*/
        return next;
    }
}
纸上得来终觉浅,绝知此事要躬行
原文地址:https://www.cnblogs.com/modesty-boy/p/13602890.html