Algorithm 一个范围内不同元素的和
考虑一个数组(基于0的索引),我必须找到 所有可能范围[i,n]的元素,其中0 例子: O(n^2)解决方案是一种可能的解决方案,我读过持久段树也可以做到这一点,尽管我找不到好的教程 它能在不到O(N^2)的时间内解决吗 如果有人指向持久段树,请解释或提供一些好的链接?这可以通过简单的动态规划算法在O(n)中完成 从数组的后面开始,使用一个基于散列的容器来存储您已经遇到的数字。最后一个元素的值,即Algorithm 一个范围内不同元素的和,algorithm,data-structures,segment-tree,Algorithm,Data Structures,Segment Tree,考虑一个数组(基于0的索引),我必须找到 所有可能范围[i,n]的元素,其中0
sum\u range[n-1]
设置为arr[n-1]
。在此之后,sum\u range[i]
的值应计算如下:
- 如果
不在所看到的数字集合中,arr[i]
sum\u range[i]=sum\u range[i+1]+arr[i]
- 否则,
sum\u range[i]=sum\u range[i+1]
array=[1,2,1,3,5]
范围总和=0
总和=0
valueset=set()
对于反向(数组)中的val:
如果val不在valueset中:
valueset.add(val)
范围_sum+=val
总和+=范围总和
打印(总计)
在哪里可以得到带有set的log n?OP要求“所有可能范围[i,n]的不同元素之和”。这不能回答这个问题。您是否有哈希插入和查找复杂性的来源?我总是听说这最多是O(log(n)),因为碰撞。我找不到任何支持或反对这一点的来源。@ArthurHavlicek dasblinkenlight的算法更好,但另一种策略是对数组中位于范围内的部分进行排序(O(n log n)
),然后遍历排序后的数组,同时对与其前辈不同的元素进行求和(O(n)
),总体时间复杂度为O(n logn)
。
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