美文网首页
Leetcode 1019 Next Greater Node

Leetcode 1019 Next Greater Node

作者: Mereder | 来源:发表于2019-04-30 09:49 被阅读0次

    题目描述

    We are given a linked list with head as the first node. Let's number the nodes in the list: node_1, node_2, node_3, ... etc.

    Each node may have a next larger value: for node_i, next_larger(node_i) is the node_j.val such that j > i, node_j.val > node_i.val, and j is the smallest possible choice. If such a j does not exist, the next larger value is 0.

    Return an array of integers answer, where answer[i] = next_larger(node_{i+1}).

    Note that in the example inputs (not outputs) below, arrays such as [2,1,5] represent the serialization of a linked list with a head node value of 2, second node value of 1, and third node value of 5.

    简而言之:找下一个比node_i大的值node_j,且j最小。如果没有则置0

    Example 1:

    Input: [2,1,5]
    Output: [5,5,0]
    

    Example 2:

    Input: [2,7,4,3,5]
    Output: [7,0,5,5,0]
    

    Example 3:

    Input: [1,7,5,1,9,2,5,1]
    Output: [7,9,9,9,0,5,0,0]
    

    Note:

    1. 1 <= node.val <= 10^9 for each node in the linked list.
    2. The given list has length in the range [0, 10000].

    解题思路

    很简单,一开始想复杂了。。。

    只需要找到下一个比node_i大的值即可。两个循环,外层循环标记当前节点node_i,内层循环遍历node_i之后的结点,只要找到第一个比node_i大的结点就退出内层循环,然后给结果数组赋值。时间复杂度O(n^2)

    题解

        public static int[] nextLargerNodes(ListNode head) {
            // 异常处置部分
            if (head == null ) return null;
            int n = 0;
            ListNode p = head;
            while(p != null){
                p = p.next;
                n++;
            }
            if (n == 0 ) return null;
            // 以上
            int []result = new int[n];
            ListNode tail = head;
            // i来标记返回数组的位置,以tail是同步的
            int i = 0;
            // tail 为 node_i
            while(tail != null){
                int max = 0;
                p = tail;
                // p 为 node_j
                while(p != null){
                    if (p.val > tail.val){
                        max = p.val;
                        break;
                    }
                    p=p.next;
                }
                // 如果存在较大值 则max就是,不存在 则max默认为0;
                result[i] = max;
                i++;
                tail = tail.next;
            }
            return result;
        }
    

    大神解法

    借助栈来实现,时间复杂度O(n),空间复杂度O(n)

    思路:栈内存放的是 结点的编号。 每压入一个编号前,先检查该编号对应元素是否大于栈顶的编号对应元素,、如果大于,则栈顶编号出列,且栈顶编号对应元素的greater为 当前编号对应元素。如果不大于,则继续压栈。

    使用ArrayList方便获取编号和元素的对应关系,且无需固定长度数组。

        public int[] nextLargerNodes(ListNode head) {
            ArrayList<Integer> A = new ArrayList<>();
            for (ListNode node = head; node != null; node = node.next)
                A.add(node.val);
            int[] res = new int[A.size()];
            Stack<Integer> stack = new Stack<>();
            for (int i = 0; i < A.size(); ++i) {
                while (!stack.isEmpty() && A.get(stack.peek()) < A.get(i))
                    res[stack.pop()] = A.get(i);
                stack.push(i);
            }
            return res;
        }
    

    相关文章

      网友评论

          本文标题:Leetcode 1019 Next Greater Node

          本文链接:https://www.haomeiwen.com/subject/yjkmnqtx.html