• 503. Next Greater Element II


    Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, output -1 for this number.

    Example 1:

    Input: [1,2,1]
    Output: [2,-1,2]
    Explanation: The first 1's next greater number is 2; 
    The number 2 can't find next greater number;
    The second 1's next greater number needs to search circularly, which is also 2.

    我们可以使用栈来进行优化上面的算法,我们遍历两倍的数组然后还是坐标i对n取余,取出数字,如果此时栈不为空,且栈顶元素小于当前数字,说明当前数字就是栈顶元素的右边第一个较大数,那么建立二者的映射,并且去除当前栈顶元素,最后如果i小于n,则把i压入栈。因为res的长度必须是n,超过n的部分我们只是为了给之前栈中的数字找较大值,所以不能压入栈,参见代码如下:

    有用hashMap 存-1的值, 用的是Arrays.fill(nums, -1) 

    用到了 stack 来求原序列中不打乱相对次序的递减子序列的技巧:

    public int[] nextGreaterElements(int[] nums) {
            int n = nums.length, next[] = new int[n];
            Arrays.fill(next, -1);
            Stack<Integer> stack = new Stack<>(); // index stack
            for (int i = 0; i < n * 2; i++) {
                int num = nums[i % n]; 
                while (!stack.isEmpty() && nums[stack.peek()] < num)
                    next[stack.pop()] = num;
                if (i < n) stack.push(i);
            }   
            return next;
        }
    

      

  • 相关阅读:
    Haproxy的安装与配置
    keepalived工作原理和配置说明
    服务器集群与负载均衡基础知识
    Linux磁盘分区与格式化
    第12章 在.NET中操作XML
    第16章 多线程
    第10章 网络编程
    第8章 流和序列化
    关于引用类型作为参数加上ref与不加ref的区别
    第3章 C#中的委托和事件
  • 原文地址:https://www.cnblogs.com/apanda009/p/7137181.html
Copyright © 2020-2023  润新知