1019. 链表中的下一个更大结点(Python)

2021-05-19  本文已影响0人  玖月晴

难度:★★★☆☆
类型:数组
方法:单调栈

题目

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ... 。

每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i) 是 node_j.val,那么就有 j > i 且 node_j.val > node_i.val,而 j 是可能的选项中最小的那个。如果不存在这样的 j,那么下一个更大值为 0 。

返回整数答案数组 answer,其中 answer[i] = next_larger(node_{i+1}) 。

注意:在下面的示例中,诸如 [2,1,5] 这样的输入(不是输出)是链表的序列化表示,其头节点的值为 2,第二个节点值为 1,第三个节点值为 5 。

示例 1:

输入:[2,1,5]
输出:[5,5,0]

示例 2:

输入:[2,7,4,3,5]
输出:[7,0,5,5,0]

示例 3:

输入:[1,7,5,1,9,2,5,1]
输出:[7,9,9,9,0,5,0,0]

提示:

对于链表中的每个节点,1 <= node.val <= 10^9
给定列表的长度在 [0, 10000] 范围内

解答

关于单调栈,有下面几点需要注意:

第一,单调栈一般用来解决列表中每个元素的下一个更大元素或更小元素的求解问题,比如说这道题;
第二,单调栈中元素从栈底到栈顶是单调递增或递减;
第三,单调栈是需要维护的,随着遍历过程动态更新的,以此来保持栈中元素的单调性。

对于这道题,我们需要准备一个单调栈,从栈底到栈顶保持非递增状态(也就是相邻元素递减或相等),由于需要位置信息用以更新结果列表中对应位置,我们的栈中的每个元素,实际上不仅仅是一个数值,而是数值以及该数值对应的位置,此外,链表只是个幌子,跟列表类似,我们需要准备一个变量loc,用来记录当前遍历到的位置,并准备结果列表res,用来保存结果,我们可以这样理解,对于res中的每个位置,都表达了该位置的结点最崇拜的偶像。

使用while循环进行遍历,每轮循环我们只研究一个结点,着重进行以下操作。

根据当前结点的值更新单调栈,这一步通过while来实现。我们的目的是,要把所有小于当前结点值head.val的元素从栈里按照顺序赶出来,将这些结点node对应位置处的值res[node.location]更新为当前结点值head.val,相当于当前结点head登上他们的榜首,替换掉原来的,成为他们的新偶像。

此外就是一些更新的操作了,要更新的变量有,位置变量loc,下一个结点head,结果列表res以及当前的单调栈。

class Node:
    def __init__(self, val, loc):
        self.value = val
        self.location = loc


class Solution:
    def nextLargerNodes(self, head):
        stack = []
        loc = 0
        res = []
        while head:
            while stack and head.val > stack[-1].value:
                node = stack.pop()
                res[node.location] = head.val
            stack.append(Node(val=head.val, loc=loc))
            res.append(0)
            head = head.next
            loc += 1
        return res

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

上一篇 下一篇

猜你喜欢

热点阅读