下一个更大元素 II
思路及解法
可以使用单调栈来解决这个问题。假如[9,8,7,10]这个数组,比9,8,7大的数字为10。即如果i
比i-1
小的话,则i
和i-1
的下一个最大数字相等。所以
- 如果
i<i-1
,则入栈 - 如果
i>i-1
,则出栈,直到栈顶的值大于i。
循环数组
因为该数组是循环的数组,可能出现[9,7,8,6]这种情况,比6大的数字为9。可以两种方法
- 一种实现方式是,把数组复制一份到数组末尾,这样虽然不是严格的循环数组,但是对于本题已经足够了,因为本题对数组最多遍历两次。
- 另一个常见的实现方式是,使用取模运算 %可以把下标
i
映射到数组 numsnums 长度的0 - N
内。
代码如下
class Solution {
/**
* @param Integer[] $nums
* @return Integer[]
*/
function nextGreaterElements($nums) {
$length = count($nums);
$stack = [];
$res = [];
for($i = 0; $i < $length; ++$i){
$res[] = -1;
}
for($i = 0; $i < $length * 2 - 1; ++$i){
while(count($stack) > 0 && $nums[$stack[count($stack) - 1]] < $nums[$i % $length]){
$res[$stack[count($stack) - 1]] = $nums[$i % $length];
array_pop($stack);
}
array_push($stack, $i % $length);
}
return $res;
}
}