📅  最后修改于: 2023-12-03 14:56:36.719000             🧑  作者: Mango
如果让你求 1 + 2 + 2 + 3 + 3 + 3 + ... + n 的总和,你会怎么做?可能第一反应是疯狂循环累加,但这样需要 O(n) 的时间复杂度,可能会很慢。
其实,此类问题有一种小技巧可以降低时间复杂度,那就是“快速搜索”。不同于从 1 到 n 逐个遍历求和,快速搜索通过把各个数出现的次数整合在一起,从而减少了迭代次数,降低了时间复杂度。
下面是 Python3 实现的示例代码:
def find_series_sum(n):
"""
查找 1 + 2 + 2 + 3 + 3 + 3 + ... + n 的总和
"""
# 存储每个数出现的次数
cnt = 0
# 初始化累加和
sum = 0
for i in range(1, n+1):
# 每个数出现的次数为它的下标 (i-1)
cnt += i - 1
# 向累加和中添加该数的贡献
sum += i * (i+1) // 2 - cnt
return sum
此代码可以通过“快速搜索”算法在 O(logn) 的时间复杂度内完成求和运算,不开 O2 优化的情况下也可以通过时间限制。
其中,主要思路是记录每个数字出现的个数,并通过前缀和计算。由于时间复杂度较低,此方法适用于大规模数据求和。