【问题标题】:Which is the best algorithm to find sum of all subarray?找到所有子数组之和的最佳算法是什么?
【发布时间】:2016-07-25 19:54:47
【问题描述】:

例如如果

a[3]={1,2,3}
 1,2,3,1+2,2+3,1+2+3  

所以我的程序应该打印
1
2
3
3
5
8

我知道有一个计算总和的公式。
但我想要的是计算个人总和的有效方法。

建议使用 seg 树?

【问题讨论】:

  • 单个总和是指数组的子数组的总和吗?
  • 这只是0 <= startIndex < 31 <= length <= 3 - startIndex 的两个循环,不是吗?
  • 这只是一个例子:p
  • 上周有几十个类似的问题。使用搜索。

标签: c++ algorithm data-structures c++14


【解决方案1】:

假设子数组是指某些作者通常所说的子数组是数组的连续切片,那么您正在寻找Kadane's algorithm

它通过逐步找到最大的子数组来工作。在搜索的任何给定点,该索引上的最大子数组要么是空数组(总和 == 零),要么包含比在前一个位置结束的最大子数组多一个元素。您可以跟踪您找到的最佳解决方案,以便将子数组与迄今为止的最佳解决方案进行比较,并返回实际的最佳解决方案。

它也可以扩展到多个维度。

【讨论】:

  • @venkatesanravi 所以你有它。我会添加为什么它可以用我自己的话,它可能会对你有所帮助。与一些学术怪物相比,这是一个非常容易理解的算法。
  • 但是 Kadane 的算法只能用于获取最大子数组对吗?或者它也可以用于获取所有子数组的总和?
  • 它不会对所有子数组求和。这可以在 O(n) 时间内完成,方法是将每个元素的乘积按其所属的子数组的数量累加。元素 a_i 所属的子数组的数量由左端点和右端点的乘积给出,这是 i * (n - i + 1) 其中i 是元素的 1 索引索引。
  • 如果你能举例说明清楚,我将非常感谢你!拿我在问题中问过的数组
  • ^^ 我在等那个:((
猜你喜欢
  • 2011-08-30
  • 2011-12-20
  • 1970-01-01
  • 2016-05-29
  • 2019-06-20
  • 2014-07-07
  • 1970-01-01
  • 2013-08-19
  • 2013-05-21
相关资源
最近更新 更多