Leetcode 3544. Subtree Inversion Sum

1. 解题思路

这一题我的思路上就是一个动态规划的思路,因为原则上我们只需要遍历一下所有的状态即可,但是这样显然时间复杂度过高,因此我们采用一个动态规划的思路用空间换时间,即可完成上述题目的解答。

具体到实现上也是比较简单,首先就是利用边的内容获取一下整的这个树的结构。

然后我们就是一个遍历,遍历的时候需要记录一下每一个节点当前的正负相位,是否可以相位反转以及如果不可以反转的话,还需要多少深度才能够进行相位反转。

2. 代码实现

给出python代码实现如下:

class Solution:
    def subtreeInversionSum(self, edges: List[List[int]], nums: List[int], k: int) -> int:
                 
        def get_graph(edges):
            graph = defaultdict(list)
            for u, v in edges:
                graph[u].append(v)
                graph[v].append(u)
                
            new_graph = defaultdict(list)
            def _dfs(u, p):
                for v in graph[u]:
                    if v == p:
                        continue
                    new_graph[u].append(v)
                    _dfs(v, u)
                return 
            _dfs(0, -1)
            return new_graph
        
        graph = get_graph(edges)
            
        @lru_cache(None)
        def dfs(u, flag, d):
            if d == 0 or d >= k:
                ans = flag * nums[u]
                for v in graph[u]:
                    ans += dfs(v, flag, 0)
                
                rev = - (flag * nums[u])
                for v in graph[u]:
                    rev += dfs(v, -flag, 1)
                return max(ans, rev)
            else:
                ans = flag * nums[u]
                for v in graph[u]:
                    ans += dfs(v, flag, d+1)
                return ans
            
        return dfs(0, 1, 0)

提交代码评测得到:耗时6642ms,占用内存774.9MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值