• Python算法练习 10.15


    leetcode 2130 链表的最大孪生和

    在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。

    • 比方说,n = 4 那么节点 0 是节点 3 的孪生节点,节点 1 是节点 2 的孪生节点。这是长度为 n = 4 的链表中所有的孪生节点。

    孪生和 定义为一个节点和它孪生节点两者值之和。

    给你一个长度为偶数的链表的头节点 head ,请你返回链表的 最大孪生和 。

    示例 1:

    输入:head = [5,4,2,1]
    输出:6
    解释:
    节点 0 和节点 1 分别是节点 3 和 2 的孪生节点。孪生和都为 6 。
    链表中没有其他孪生节点。
    所以,链表的最大孪生和是 6 。
    

    示例 2:

    输入:head = [4,2,2,3]
    输出:7
    解释:
    链表中的孪生节点为:
    - 节点 0 是节点 3 的孪生节点,孪生和为 4 + 3 = 7 。
    - 节点 1 是节点 2 的孪生节点,孪生和为 2 + 2 = 4 。
    所以,最大孪生和为 max(7, 4) = 7 。

    先用快慢指针找到表中点,从中点开始用头插法,反转表的后半部分,最后从头开始遍历两个表,记录最大和即可。

    1. # Definition for singly-linked list.
    2. # class ListNode(object):
    3. # def __init__(self, val=0, next=None):
    4. # self.val = val
    5. # self.next = next
    6. class Solution(object):
    7. def pairSum(self, head):
    8. """
    9. :type head: Optional[ListNode]
    10. :rtype: int
    11. """
    12. head = ListNode(0, head)
    13. fast = slow = head.next
    14. while fast != None:
    15. slow = slow.next
    16. fast = fast.next.next
    17. reverseHead = ListNode(0, None)
    18. slowPre = slow
    19. while slow != None:
    20. slowPre = slowPre.next
    21. slow.next = reverseHead.next
    22. reverseHead.next = slow
    23. slow = slowPre
    24. node1 = head.next
    25. node2 = reverseHead.next
    26. maxVal = 0
    27. while node1 and node2:
    28. maxVal = max(node1.val + node2.val, maxVal)
    29. node1 = node1.next
    30. node2 = node2.next
    31. return maxVal

     leetcode 104 二叉树的最大深度

    给定一个二叉树 root ,返回其最大深度。

    二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

    示例 1:

    输入:root = [3,9,20,null,null,15,7]
    输出:3
    

    示例 2:

    输入:root = [1,null,2]
    输出:2

     简单的前序遍历

    1. # Definition for a binary tree node.
    2. # class TreeNode(object):
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution(object):
    8. def maxDepth(self, root):
    9. """
    10. :type root: TreeNode
    11. :rtype: int
    12. """
    13. def goNextLevel(root, depth):
    14. depthLeft = depthRight = depth
    15. if root:
    16. depth += 1
    17. depthLeft = goNextLevel(root.left, depth)
    18. depthRight = goNextLevel(root.right, depth)
    19. return max(depthLeft, depthRight)
    20. depth = 0
    21. if not root:
    22. return 0
    23. else:
    24. maxdepth = goNextLevel(root, depth)
    25. return maxdepth

    leetcode 872 叶子相似的树

    请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 

    举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。

    如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

    如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

     

    示例 1:

    输入:root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]
    输出:true
    

    示例 2:

    输入:root1 = [1,2,3], root2 = [1,3,2]
    输出:false
    

     本质就还是前序遍历

    1. # Definition for a binary tree node.
    2. # class TreeNode(object):
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution(object):
    8. def leafSimilar(self, root1, root2):
    9. """
    10. :type root1: TreeNode
    11. :type root2: TreeNode
    12. :rtype: bool
    13. """
    14. def goNextLevel(root, LeafArr):
    15. if not root.left and not root.right:
    16. LeafArr.append(root.val)
    17. return
    18. if root.left:
    19. goNextLevel(root.left, LeafArr)
    20. if root.right:
    21. goNextLevel(root.right, LeafArr)
    22. root1LeafArr = []
    23. root2LeafArr = []
    24. if root1:
    25. goNextLevel(root1, root1LeafArr)
    26. if root2:
    27. goNextLevel(root2, root2LeafArr)
    28. return root1LeafArr == root2LeafArr

     leetcode 1448 统计二叉树中好节点的数目

    给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。

    「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。

     

    示例 1:

    输入:root = [3,1,4,3,null,1,5]
    输出:4
    解释:图中蓝色节点为好节点。
    根节点 (3) 永远是个好节点。
    节点 4 -> (3,4) 是路径中的最大值。
    节点 5 -> (3,4,5) 是路径中的最大值。
    节点 3 -> (3,1,3) 是路径中的最大值。

    示例 2:

    输入:root = [3,3,null,4,2]
    输出:3
    解释:节点 2 -> (3, 3, 2) 不是好节点,因为 "3" 比它大。

     递归函数忘了写最后一句return,导致goodNum总是None

    还是前序遍历,没什么好说的

    1. # Definition for a binary tree node.
    2. # class TreeNode(object):
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution(object):
    8. def goodNodes(self, root):
    9. """
    10. :type root: TreeNode
    11. :rtype: int
    12. """
    13. # 记录从根节点遍历到该叶子节点的最大值,如果这个最大值不大于叶子节点的值,就是好节点
    14. def goNextLevel(root, goodNum, maxVal):
    15. if maxVal <= root.val:
    16. goodNum += 1
    17. if not root.left and not root.right:
    18. return goodNum
    19. maxVal = max(maxVal, root.val)
    20. if root.left:
    21. goodNum = goNextLevel(root.left, goodNum, maxVal)
    22. if root.right:
    23. goodNum = goNextLevel(root.right, goodNum, maxVal)
    24. return goodNum
    25. goodNum = 0
    26. maxVal = root.val
    27. if not root:
    28. return goodNum
    29. else:
    30. return goNextLevel(root, goodNum, maxVal)

  • 相关阅读:
    ubuntu下使用docker命令行
    开启本地静态服务器-Node
    机器学习_个人笔记_周志华(停更中......)
    【jvm】程序计数器
    ROS控制:ROS Control软件包
    申请HTTPS证书
    [Lua][Love] 有效碰撞处理の类别与位掩码 | fixture:setFilterData
    构建可维护的大规模应用:框架架构的最佳实践
    多商户商城系统功能拆解43讲-平台端应用-客服话术
    C++11智能指针weak_ptr
  • 原文地址:https://blog.csdn.net/Michelle209/article/details/133839506