Amicable Number
题目描述
就是 数A 的所有因数(包括1,不包括A) 之和 等于 B。B的所有因数之和又刚好为A。 且 A != B. 求[1, N] 中所有符合条件的pair.
解题方法
brute force
对于整数i, 找出所有1-n之间的i的因数和,保存在一个array里。
如果对于i,检查所有1-i是否是i的因子,那么这个时间复杂度就是O(n^2)
.
然后遍历这个array,找出符合条件的Pair, 时间复杂度O(n)
- time
O(n^2 + n) = O(n^2)
- space
O(n)
优化,如果找因子只查到sqrt(i),就是O(n^3/2)
O(nlogn)
的方法
利用类似count prime的方法找因子, 将他们存到array里
def generate(n):
divisor_sum = [1 for i in range(n+1)]
for i in range(2, n+1):
j = i + i
while j <= n:
divisor_sum[j] += i
j += i
return dp
那么对于这一过程的时间复杂度是, 是一个Harmonic series
O(n/2 + n/3 + n/4 + .... + 1) = O(logn)
那个计算因子和的过程就是O(nlogn)
Solution
def generate(n):
divisor_sum = [1 for i in range(n+1)]
for i in range(2, n+1):
j = i + i
while j <= n:
divisor_sum[j] += i
j += i
return dp
def find_pair(n):
results = []
divisor_sum = generate(n)
for i in range(1, n+1):
j = divisor_sum[i]
if i < j and j <= n and divisor_sum[j] == i:
results.append((i, j))
return results