给出一个以头节点 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]
这道题的解法是使用单调栈
,单调栈的特点如下。
例子:[2,7,4,3,5],单调递减栈
最后结果,[7, 5]
利用单调递减栈的特点,我们来开始解题。
以 示例 2
为例子,首先初始化一个长度为 5 的 0 值列表和一个栈:
nums: [2, 7 ,4, 3, 5]
res: [0, 0, 0, 0, 0]
stack: []
2 索引入栈:
res: [0, 0, 0, 0, 0]
stack: [0]
7 索引入栈,2 索引出栈,并将 7 的值记录在 res 中对应的 2 的索引的位置中:
res: [7, 0, 0, 0, 0]
stack: [1]
4 索引入栈:
res: [7, 0, 0, 0, 0]
stack: [1, 2]
3 索引入栈:
res: [7, 0, 0, 0, 0]
stack: [1, 2, 3]
5 索引入栈, 3、4 的索引出栈,并将 5 的值记录在 res 中对应的 3、4 的索引的位置中:
res: [7, 0, 5, 5, 0]
stack: [1, 4]
最后结果,[7, 0, 5, 5, 0]
将以上解题思路转换为代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def nextLargerNodes(self, head: ListNode) -> List[int]:
nums = []
# 将链表转换为数组
while head:
nums.append(head.val)
head = head.next
res = [0] * len(nums)
stack = []
for i, n in enumerate(nums):
while stack and nums[stack[-1]] < n:
res[stack.pop()] = n
stack.append(i)
return res
What is DevOps? And, it’s Importance.
这篇文章很好的介绍了 DevOps,文章中提到了几个很多人对 DevOps 的错误理解。
按照原文和本人的理解,DevOps 更是一种开发理念,从设计、开发、测试,一直到监控、反馈改进,然后再到设计。这是一个回环,可以形成正反馈的回环。
很多公司想引入 DevOps,首先应该从让开发人员理解 DevOps 的概念开始,因为已经有很多成熟的技术解决方案了。
利用 SQL Explain 可以用来查看 SQL 查询是否使用了索引,还有很多其他的功能,详见:
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
我们的墙已经够高了,我选择不为墙内的墙贡献砖头。— 《微信墙中墙》