zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    Http协议(一)基础知识
    Redis问题汇总
    Sql Server存储过程传递XML参数
    C# Redis
    Task的异常捕获和处理方法
    Entity Framework教程
    WebBrowser 弹窗体关闭原理
    C# 虹软SDK视频人脸识别和注册
    C#性能优化:延迟初始化Lazy
    DZ 特殊主题简单开发教程
  • 原文地址:https://www.cnblogs.com/qiye5757/p/14491400.html
Copyright © 2011-2022 走看看