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。

相关推荐
历程里程碑2 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
iAkuya2 小时前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展
VT.馒头2 小时前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
Charlie_lll4 小时前
力扣解题-移动零
后端·算法·leetcode
iAkuya5 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
YuTaoShao10 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
TracyCoder12312 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
草履虫建模19 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
VT.馒头1 天前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
不穿格子的程序员1 天前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法