dsfafaadfsa

leetcode每日一题之7.下一个更大元素 II

下一个更大元素 II

思路及解法

可以使用单调栈来解决这个问题。假如[9,8,7,10]这个数组,比9,8,7大的数字为10。即如果ii-1小的话,则ii-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;
    }
}
posted @ 2021-03-06 17:03  狩猎者丿七夜  阅读(46)  评论(0编辑  收藏  举报