和小于或等于给定'k'的子数组的数量

时间:2016-03-03 19:34:36

标签: algorithm data-structures time-complexity

我知道一个O(n2)溶液,可以用更好的方式完成,因为数组中元素数量的极限是<= 100,000

1 个答案:

答案 0 :(得分:4)

是的,如果所有元素都是非负数,则存在O(n lgn)算法。

  1. p[i]定义为p[0..i](我们称之为前缀总和)
  2. 的总和
  3. 对于每个i:二进制搜索最大值jp[j] - p[i-1] <= k,将j-i+1添加到计数器
  4. 总复杂度为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