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 @   狩猎者丿七夜  阅读(49)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示