题目
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 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;
}
}