【问题标题】:How to solve M times prefix sum with better time complexity如何以更好的时间复杂度求解 M 次前缀和
【发布时间】:2022-06-10 04:09:25
【问题描述】:

问题是通过重复该过程M次来找到长度为N的数组的前缀和。例如

Example N=3
M=4
array = 1 2 3
output = 1 6 21
Explanation:
Step 1 prefix Sum = 1 3 6
Step 2 prefix sum = 1 4 10
Step 3 prefix sum = 1 5 15
Step 4(M) prefix sum = 1 6 21

Example 2:
N=5
M=3
array = 1 2 3 4 5
output = 1 5 15 35 70

我无法解决问题并不断超出石灰限制。我使用动态编程在 O(NM) 时间内解决它。我环顾四周,找到了以下通用数学解决方案,但我仍然无法解决它,因为我的数学不是很好理解它。有人可以以更好的时间复杂度解决它吗?

https://math.stackexchange.com/questions/234304/sum-of-the-sum-of-the-sum-of-the-first-n-natural-numbers

【问题讨论】:

  • 如果我理解这个问题,那么你需要对数组中的任何数字求和——它并不总是 1、2、3、4、5 ......所以前 N 个自然数之和的通用公式获胜解决不了问题。对 N 和 M 是否有任何限制?
  • 不,它们总是 N 个自然数,例如 1、2、3、4,......不记得确切的约束,但它在 N 是 1000 和 M 是 10^9 的范围内,因为我也求和时需要取模 10^9。

标签: algorithm math dynamic-programming prefix-sum


【解决方案1】:

提示:3, 4, 56, 10, 15 是帕斯卡三角形中的对角线部分。

JavaScript code:

function f(n, m) {
  const result = [1];
  
  for (let i = 1; i < n; i++)
    result.push(result[i-1] * (m + i + 1) / i);
  
  return result;
}

console.log(JSON.stringify(f(3, 4)));
console.log(JSON.stringify(f(5, 3)));

【讨论】:

  • 但是帕斯卡的三角形是 O(N^2) 并且通过添加前面的行来工作,所以我看不出这种方法与我对 O(MN) 复杂度所做的不同。在某些情况下,这显然没有超过时间限制。
  • @rsham 你能分享一个在线法官的链接吗?
  • 那是在线评估的一部分,它不再可用。还没有收到结果,但很可能我失败了。现在寻求未来的解决方案和我自己的理解。
  • @rsham 我添加了代码和解释链接。
  • 多谢。看来我还有很多东西要学。
猜你喜欢
  • 2014-01-28
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多