📅  最后修改于: 2023-12-03 15:28:34.059000             🧑  作者: Mango
给定一个链表,求节点值的总和,其中节点值正好包含三个因子的值。
本题要求返回节点值为正整数,且其包含三个因子的值的所有节点的值的总和。例如,节点值为 162,包含因子 2、3、27,因此它是一个符合条件的节点。如果链表中的所有节点均不符合条件,则返回 0。
对于一个正整数 n,如果其能够分解为以下形式:
$$ n = 2^a \times 3^b \times 5^c \times \cdots $$
这里 a、b、c 等是整数且均为非负整数,且不存在其他质数因子,则称 n 是一个三个因子的数。
该问题可以通过以下两个步骤解决:
步骤 1 可以通过以下两种方法实现:
步骤 2 可以通过以下方式实现:
根据第一步分解得到的质因数分解式,统计其中因子数为 2、3 和其他数的个数,如果因子数为 2 、3 的个数都大于 0,而且没有其他因子,则该数为一个三个因子的数。
以下给出 Python 3 代码实现,链表节点定义为 ListNode 类型。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def sum_of_nodes_with_three_factors(head: ListNode) -> int:
def is_three_factors_num(n: int) -> bool:
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
factors = [0] * len(primes)
for i, p in enumerate(primes):
while n % p == 0:
n //= p
factors[i] += 1
if n == 1:
break
if n > 1:
return False
return factors.count(2) >= 1 and factors.count(3) >= 1 and factors.count(1) == len(primes) - factors.count(2) - factors.count(3)
sum = 0
while head:
if is_three_factors_num(head.val):
sum += head.val
head = head.next
return sum if sum != 0 else 0
对于 n 个节点的链表,需要对每个节点进行判断,所以时间复杂度为 O(n)。在判断一个数字是否为三个因子的数时,使用了质因数分解算法,时间复杂度为 O(logn),其中 n 表示数字的大小。
需要使用 $O(1)$ 的额外空间来存储 sum,以及一个存储质因数分解结果的数组。由于质因数个数是常数级别的,因此空间复杂度仍然为 $O(1)$。