购物网站开发毕业设计开题报告,西安在线网站,西安专业宣传册设计公司,七牛镜像存储 wordpressLeetcode 2867. Count Valid Paths in a Tree 1. 解题思路2. 代码实现 题目链接#xff1a;2867. Count Valid Paths in a Tree
1. 解题思路
这一题思路上的话由于要求路径上有且仅有一个质数点#xff0c;因此#xff0c;一个直接的思路就是考察所有质数的点作为中心点时…Leetcode 2867. Count Valid Paths in a Tree 1. 解题思路2. 代码实现 题目链接2867. Count Valid Paths in a Tree
1. 解题思路
这一题思路上的话由于要求路径上有且仅有一个质数点因此一个直接的思路就是考察所有质数的点作为中心点时其辐射出去的非质数点的个数。
假设一个质数点 p p p上有 k k k个合数子节点然后每一个合数子节点对应的只包含合数的子树当中的节点个数分别为 n 1 , ⋯ n k n_1, \cdots n_k n1,⋯nk个那么包含且仅包含 p p p的路径个数为 p p p作为路径的一个节点 N ∑ i 1 k n i N \sum\limits_{i1}^{k}n_i Ni1∑kni p p p作为路径的一个中间节点 N ∑ i 1 k ∑ j 1 , j ≠ i k n i × n j ∑ i 1 k n i ( ∑ j 1 k n j − n i ) / 2 N \sum\limits_{i1}^{k}\sum\limits_{j1, j\neq i}^{k} n_i \times n_j\sum\limits_{i1}^{k}n_i(\sum\limits_{j1}^{k}n_j - n_i) / 2 Ni1∑kj1,ji∑kni×nji1∑kni(j1∑knj−ni)/2
由此问题就转化为只要求得每一个质数节点 p p p周围相邻的合数节点 u u u作为根节点时的只包含合数节点的子树的节点的个数。
而这个问题只需要用一个深度优先遍历就可以完成了。当然为了优化执行效率我们加上了一个cache来对其进行优化。
2. 代码实现
给出最终的python代码实现如下
lru_cache(None)
def get_primes():n 10**5status [0 for _ in range(n)]primes []for i in range(2, n):if status[i] 1:continueprimes.append(i)for j in range(i, n, i):status[j] 1return primesPRIMES get_primes()class Solution:def countPaths(self, n: int, edges: List[List[int]]) - int:if n 1:return 0primes PRIMES[:bisect.bisect_right(PRIMES, n)]prime_set set(primes)graph defaultdict(list)for u, v in edges:graph[u].append(v)graph[v].append(u)lru_cache(None)def dfs(u, pre):res 1for v in graph[u]:if v ! pre and v not in prime_set:res dfs(v, u)return resdef query(u):nodes [dfs(v, -1) for v in graph[u] if v not in prime_set]res 0s sum(nodes)for k in nodes:res k * (s-k)return res // 2 sreturn sum(query(u) for u in primes)提交代码评测得到耗时1683ms占用内存71.2MB。