algorithm - 总和小于或等于给定 'k' 的子数组数

标签 algorithm data-structures time-complexity

我知道一个 O(n2) 的解决方案,它可以用更好的方式完成吗,因为数组中元素的数量限制是 <=100,000

最佳答案

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

  1. 定义p[i]p[0..i] 的总和(我们称之为前缀和)
  2. 对于每个 i : 二进制搜索最大值 j这样 p[j] - p[i-1] <= k , 添加 j-i+1到柜台

总复杂度为 O(n) + O(n lgn) = O(n lgn)

之所以有效,是因为对于每个 i ,我们试图找到从 i 开始的最大范围这样这个范围的总和是 <= k。

让这个范围是[i..j] ,因为所有元素都是非负的,所以 [i..i], [i..i+1], [i..i+2] ... [i..j]都是和<= k的子数组,总共有j-i+1他们中的。

我们为每个 i 找到了这样的范围, 从i开始不断增加子数组的个数哪个总和 <= k

关于algorithm - 总和小于或等于给定 'k' 的子数组数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35781390/

相关文章:

algorithm - 最好的排序方法?

arrays - 可能更简单的 O(n) 解决方案来找到长度为 K(或更多)的具有最大平均值的子数组

java - 为什么我不能使用 Vector 在指定索引处插入元素?

algorithm - 搜索操作复杂度

algorithm - 如何在二叉树中找到最长的连续路径

java - 网格上具有阻挡单元和移动单元的最短路径

algorithm - 实时获取网站排名信息

python - 将一组 n 个整数转换为一个 n 个整数列表的时间复杂度是多少?

c++ - 什么是 2 遍和 1 遍哈希表

java - 寻找缺失的整数(Codility 测试)