【发布时间】:2019-04-28 22:45:39
【问题描述】:
今天我用下面的代码在 HackerRank 上做了一个简单的挑战,它 100% 可以接受并且有效,但我想知道是否有办法通过消除重复计算来进一步减少所需的循环。
让我直观地向您展示正在发生的事情,当我完成时,我的代码示例将远远落后!
代码获取数字数组中的第一个数字并将其添加到每个后续数字中,并检查它是否可以被k = 3整除。
在 6 个数字的数组中,这相当于 15 个循环,即O(n²),这意味着我的循环将随着输入量呈指数增长。 7 个数字将是 21 个循环。
PS,您可能认为 6 应该是 21 个循环,7 应该是 28,但请记住,我总是将当前数字添加到下一个数字,最后一个数字除外。
视觉分解
input: [1, 3, 2, 6, 1, 2]
- 1+3, 1+2, 1+6, 1+1, 1+2
- 3+2, 3+6, 3+1, 3+2
- 2+6, 2+1, 2+2
- 6+1、6+2
- 1+2
说明
如果您查看我在粗体中输入的数字,您会发现它们是重复计算。 斜体 数字是可被k = 3 整除的数字。现在我们开始讨论我的问题。我怎样才能消除这个重复的数学,在这个特定的例子中,这会使我的循环从 15 减少到 8。如果所有数字都不同,该算法仍会出现O(n²) 的更坏情况,但这仍然是一种优化。
代码演示
function divisibleSumPairs(k, a) {
let pairs = 0;
for (let i = 0; i < a.length - 1; i++) {
for (let j = i + 1; j < a.length; j++) {
if ((a[i] + a[j])/k % 1 === 0) pairs++;
}
}
console.log(pairs);
}
divisibleSumPairs(3, [ 1, 3, 2, 6, 1, 2 ])
【问题讨论】:
-
SO 用于特定的编程问题。您的问题与CR 相比,更具有主题性。
-
恭喜!你刚刚揭开了dynamic programming的奇妙世界!现在去领取你的CLRS副本。
-
@hindmost,感谢您对 CR 的提醒。我对在哪个地方发布问题有点犹豫。
-
谢谢@EmilVikström,我实际上已经拥有那本书了。 :)
-
如果您需要处理所有组合,则无法减少循环数。但是你想要达到的目标是什么?你需要得到除以3的总和吗?或数字的位置他们的总和
% 3 === 0?还是什么?
标签: javascript algorithm loops optimization big-o