<
ARTS 第三周
>
上一篇

ARTS 第二周
下一篇

ARTS 第四周
Toc
ARTS Week-3

ARTS Week-3

Algorithm

1019. 链表中的下一个更大节点

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

每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i)node_j.val,那么就有 j > inode_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],单调递减栈

  1. 2 入栈:[2]
  2. 7 入栈,2 出栈:[7]
  3. 4 入栈:[7, 4]
  4. 3 入栈:[7, 4, 3]
  5. 5 入栈,3、4 出栈:[7, 5]

最后结果,[7, 5]

利用单调递减栈的特点,我们来开始解题。

示例 2 为例子,首先初始化一个长度为 5 的 0 值列表和一个栈:

nums: [2, 7 ,4, 3, 5]

res: [0, 0, 0, 0, 0]

stack: []

  1. 2 索引入栈:

    res: [0, 0, 0, 0, 0]

    stack: [0]

  2. 7 索引入栈,2 索引出栈,并将 7 的值记录在 res 中对应的 2 的索引的位置中:

    res: [7, 0, 0, 0, 0]

    stack: [1]

  3. 4 索引入栈:

    res: [7, 0, 0, 0, 0]

    stack: [1, 2]

  4. 3 索引入栈:

    res: [7, 0, 0, 0, 0]

    stack: [1, 2, 3]

  5. 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

Review

What is DevOps? And, it’s Importance.

这篇文章很好的介绍了 DevOps,文章中提到了几个很多人对 DevOps 的错误理解。

按照原文和本人的理解,DevOps 更是一种开发理念,从设计、开发、测试,一直到监控、反馈改进,然后再到设计。这是一个回环,可以形成正反馈的回环。

很多公司想引入 DevOps,首先应该从让开发人员理解 DevOps 的概念开始,因为已经有很多成熟的技术解决方案了。

Tip

利用 SQL Explain 可以用来查看 SQL 查询是否使用了索引,还有很多其他的功能,详见:

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

Share

我们的墙已经够高了,我选择不为墙内的墙贡献砖头。— 《微信墙中墙

Top
Foot