1019. 链表中的下一个更大节点
题目地址(1019. 链表中的下一个更大节点)
https://leetcode-cn.com/problems/next-greater-node-in-linked-list/
题目描述
前置知识
链表
栈
公司
腾讯
字节
思路
看完题目就应该想到单调栈才行,LeetCode 上关于单调栈的题目还不少,难度都不小。但是一旦你掌握了这个算法,那么这些题目对你来说都不是问题了。
如果你不用单调栈,那么可以暴力$O(N^2)$的时间复杂度解决,只需要双层循环即可。但是这种做法应该是过不了关的。使用单调栈可以将时间复杂度降低到线性,当然需要额外的$O(N)$的空间复杂度。
顾名思义,单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。为了描述方便,以下举例及代码以维护一个整数的单调递减栈为例。将一个元素插入单调栈时,为了维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性的前提下弹出最少的元素。
例如,栈中自顶向下的元素为 1,2,4,5 ,插入元素 3 时为了保证单调性需要依次弹出元素 :
最开始栈是这样的: [5,4,2,1]
为了维护递减特性,1,2 需要被移除。此时栈是这样的: [5,4]
我们将 3 push 到栈顶即可
此时栈是这样的: [5,4,3]
用代码描述如下:
Python Code:
关键点
单调栈(单调递减栈)
单调栈的代码模板
代码
Python Code:
复杂度分析
其中 N 为链表的长度。
时间复杂度:$O(N)$
空间复杂度:$O(N)$
扩展
甚至可以做到 O(1)的空间复杂度,请参考[C# O(n) time O(1) space](https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/267090/C-O(n)-time-O(1)-space)
相关题目
最后更新于