我知道一个O(n2)溶液,可以用更好的方式完成,因为数组中元素数量的极限是<= 100,000
答案 0 :(得分:4)
是的,如果所有元素都是非负数,则存在O(n lgn)算法。
p[i]
定义为p[0..i]
(我们称之为前缀总和)i
:二进制搜索最大值j
,p[j] - p[i-1] <= k
,将j-i+1
添加到计数器总复杂度为O(n) + O(n lgn) = O(n lgn)
为什么它起作用,是因为对于每个i
,我们试图找到从i
开始的最大范围,使得此范围的总和为&lt; = k。
设这个范围为[i..j]
,因为所有元素都是非负数,所以[i..i], [i..i+1], [i..i+2] ... [i..j]
都是子数组,其和为&lt; = k,总共有j-i+1
个。
我们为每个i
找到这样的范围,并继续添加从i
开始的子数组,其总和&lt; = k