【发布时间】:2017-06-25 23:07:18
【问题描述】:
我想找出所有长度为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)。
【问题讨论】:
-
没有。想想看,你必须扫描整个阵列。你不能比 O(n) 更好。您只能优化线性运行时的系数。
-
您不能在少于
O(n)的时间内查看n数字。 -
如果我只是想从得到的答案中找出 sum 的最大值?
-
如果你计算一个新数组
sums,其中sums[i] = arr[0] + ... + arr[i]你可以在O(n - k)中返回结果 -
结果的大小为 n - k + 1。如果 k 是常数,在 O(log n) 时间内生成 n - k + 1 个数字似乎是不可能的。
标签: c++ c algorithm sliding sub-array