我想找出长度K
的所有连续子数组的总和
对于给定n
的给定长度k < n
的数组。例如,让给定的数组为arr[6]={1,2,3,4,5,6}
和k=3
,然后回答为(6,9,12,15)
。
它可以获得:
(1+2+3)=6,
(2+3+4)=9,
(3+4+5)=12,
(4+5+6)=15.
我已尝试使用长度为k
的滑动窗口,但其时间复杂度为O(n)
。是否需要更少时间的解决方案,例如O(log n)
。
答案 0 :(得分:7)
除非您知道数组的某些特定属性(例如元素的排序,数组中包含的元素的范围等),否则您需要检查每个单独的值,从而产生{{1}复杂性。
如果,例如,您知道数组中值的总和为O(n)
(也许是因为您自己知道T
或者给出了范围)您可以考虑除T
个元素之外的所有元素都包含在(K-1)
个不同的总和中。这意味着K
总和减去一定数量,您可以适当减少第一个和最后T.K
个值的值,从而产生复杂度K
的算法。 / p>
但请注意,为了实现与此类似的策略,您必须知道有关数组中值的其他一些特定信息,可能是它们的范围或它们的总和。
答案 1 :(得分:1)
你可以使用Segment树的数据结构,虽然它的构建需要O(n log n),但是你可以在O(log n)中找到任何间隔的总和,并在O中修改数组的每个元素(log n) https://en.wikipedia.org/wiki/Segment_tree