在给定数组中找到长度为k的所有连续子阵列的总和

时间:2017-02-08 11:01:12

标签: c++ c algorithm sliding sub-array

我想找出长度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)

2 个答案:

答案 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