考虑一个数组(基于0的索引)我必须找到不同的总和 所有可能范围[i,n]的元素,其中0 <我&lt; Ñ
arr={1,2,1,3}
sum_range[0,3]={1,2,3}=6
sum_range[1,3]={1,2,3}=6
sum_range[2,3]={1,3}=4
sum_range[3,3]={3}=3
O(n ^ 2)解决方案是一种可能的解决方案,我已经阅读了持久性分段树也可以做到这一点虽然我找不到好的教程。
可以在不到O(N ^ 2)的时间内解决吗?
如果有人指出持久性细分树,请解释或提供一些好的链接?
答案 0 :(得分:4)
这可以使用简单的动态编程算法在O(n)中完成。
从数组的后面开始,并使用基于散列的容器来存储您已经遇到的数字。最后一个元素的值,即sum_range[n-1]
设置为arr[n-1]
。之后,sum_range[i]
的值应按如下方式计算:
arr[i]
不在所见号码集中,sum_range[i] = sum_range[i+1]+arr[i]
sum_range[i] = sum_range[i+1]
由于检查哈希容器的值为O(1)并且将项目添加到哈希容器的成本对于n个项目分摊O(1),因此该算法的总成本为O(n)
与使用O(1)空间的O(n 2 )算法相比,此算法为哈希容器使用额外的O(n)空间。
答案 1 :(得分:0)
切割数组(O(n)),然后使用集合并将值添加到集合中。
在python3.x代码中,在评论后编辑:
array = [1, 2, 1, 3, 5]
range_sum = 0
total_sum = 0
valueset = set ()
for val in reversed(array):
if val not in valueset :
valueset.add (val)
range_sum += val
total_sum += range_sum
print (total_sum)