Leetcode 2872. Maximum Number of K-Divisible Components

  • [Leetcode 2872. Maximum Number of K-Divisible Components](#Leetcode 2872. Maximum Number of K-Divisible Components)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题思路上我觉得还是挺直接的,就是一个自底向上的团聚算法。

首先,由于题目中保证了所有节点的总和一定是k的倍数,因此事实上我们的任意切割都不会导致剩余其他点的总和无法被k整除。故一个简单直接的思路就是自底向上地进行团聚。

我们首先找到所有的叶子节点,即度为1的点,然后考察他们的value是否能够被k整除,如果可以,那么进行切割即可,这样的切割一定不会影响其他节点。

然后,对于无法进行切割的节点,我们将其合并至其父节点当中,即将两者绑定为一个节点,此时再考察其父节点是否变成了一个叶子节点。

我们只需要重复上述操作直到一直处理到最终的根节点即可得到最终的切分方式。

需要注意的是,由于在切割发生时子节点的和被k整除,因此我们再合并过程中事实上并不需要区分切割或者没有切割,因为后者事实上不会对结果产生影响,这样就进一步简化了我们的代码,虽然逻辑上多绕了一下......

2. 代码实现

给出最终的python代码实现如下:

python 复制代码
class Solution:
    def maxKDivisibleComponents(self, n: int, edges: List[List[int]], values: List[int], k: int) -> int:
        if n == 1:
            return 1
        graph = defaultdict(set)
        for u, v in edges:
            graph[u].add(v)
            graph[v].add(u)
            
        q = [u for u in graph if len(graph[u]) == 1]
        res = 0
        
        while q:
            u = q.pop(0)
            if values[u] % k == 0:
                res += 1
            for v in graph[u]:
                graph[v].remove(u)
                if len(graph[v]) == 1:
                    q.append(v)
                values[v] += values[u]
        return res

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

相关推荐
zander25815 小时前
LeetCode 300. 最长递增子序列
算法·leetcode·深度优先
欧叶冲冲冲15 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
圣保罗的大教堂15 小时前
leetcode 3622. 判断整除性 简单
leetcode
Lyyaoo.16 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
圣保罗的大教堂17 小时前
leetcode 2996. 大于等于顺序前缀和的最小缺失整数 简单
leetcode
圣保罗的大教堂18 小时前
leetcode 3702. 按位异或非零的最长子序列 中等
leetcode
青 春 记 忆19 小时前
LeetCode 206. 反转链表|Python 解法详解
python·leetcode·链表
青 春 记 忆21 小时前
LeetCode 226. 翻转二叉树|Python 解法详解
python·算法·leetcode
啊嘞嘞?1 天前
力扣(回文链表)
算法·leetcode·链表