ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

千问 LeetCode LCP 10. 二叉树任务调度 Python3实现

千问    LeetCode LCP 10. 二叉树任务调度 Python3实现 解题思路本题的核心是树形DP后序遍历每个节点需要返回两个信息1. 执行完以该节点为根的子树的最小时间 min_time2. 该子树所有节点的执行时间总和 sum_time即单核串行执行的总时长关键推导对于当前节点 node它必须在左右子树都完成后才能执行因此总时间 左右子树完成的最小时间 node.val。而左右子树的最小完成时间由三个约束中的最大值决定1. 左子树的最小执行时间左子树本身的最短完成时间无法再压缩2. 右子树的最小执行时间右子树本身的最短完成时间无法再压缩3. (sum_left sum_right) / 2双核理想并行下的理论下限所有任务都能完美并行时的最短时间最终状态转移min_time max(left.min_time, right.min_time, (left.sum_time right.sum_time) / 2) node.valsum_time left.sum_time right.sum_time node.valPython3 实现# Definition for a binary tree node.# class TreeNode:# def __init__(self, val0, leftNone, rightNone):# self.val val# self.left left# self.right rightclass Solution:def minimalExecTime(self, root: TreeNode) - float:def dfs(node):if not node:return 0.0, 0.0# 后序遍历先处理左右子树left_min, left_sum dfs(node.left)right_min, right_sum dfs(node.right)# 当前节点的min_time由三个约束的最大值决定current_min max(left_min, right_min, (left_sum right_sum) / 2) node.val# 当前子树的串行总时间current_sum left_sum right_sum node.valreturn current_min, current_sumreturn dfs(root)[0]示例走读以示例3 root [1, 3, 2, null, null, 4, 4] 为例树结构1/ \3 2/ \4 4后序遍历顺序3 → 4 → 4 → 2 → 11. 节点3叶子min3, sum32. 节点4叶子min4, sum43. 节点4叶子min4, sum44. 节点2- left_min4, left_sum4- right_min4, right_sum4- current_min max(4, 4, (44)/2) 2 max(4,4,4) 2 6- current_sum 442 105. 节点1- left_min3, left_sum3- right_min6, right_sum10- current_min max(3, 6, (310)/2) 1 max(3,6,6.5) 1 7.5- current_sum 3101 14最终返回 7.5与示例输出一致。复杂度分析- 时间复杂度O(n)每个节点仅访问一次n 为节点数- 空间复杂度O(h)h 为树的高度递归栈的开销最坏情况链状树为 O(n)平衡树为 O(log n)这题的本质其实是经典的双核任务调度问题需要我帮你整理一份类似的树形DP题单吗比如 LeetCode 124「二叉树中的最大路径和」等。
返回列表