报告整数乘积的算法

时间:2014-09-30 20:43:16

标签: algorithm

披露此问题基于CS类的问题。希望扩展它。

最初的问题很简单,给定一组n个整数,报告n整数的n-1个产品(每次错过不同的n_i)。它是在线性时间内运行的。

例如,一组{1, 2, 3, 4}会报告2 * 3 * 41 * 3 * 41 * 2 * 41 * 2 * 3

最简单的解决方案(我能想到的)就是简单地遍历所有n个整数并计算它们的全部产品(1 * 2 * 3 * 4)。然后第二次单步执行它们,并使用除法将总乘积除以每个整数。每次报告解决方案(24 / 1, 24 / 2, 24 / 3, 24 / 4)。

以上工作并以线性时间运行。教授虽然建议我们也想出办法,不分裂。仍然没有空间限制,只是线性时间限制。我已经考虑过了,但我正在画一个空白。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

您可以先计算一个包含所有主要产品的数组 - 线性时间:

1 
1 * 2
1 * 2 * 3
1 * 2 * 3 * 4

然后是尾随的 - 这也是线性时间:

            4
        3 * 4
    2 * 3 * 4
1 * 2 * 3 * 4

任何答案都可以直接找到,或者计算为第一个列表中的一个项目和第二个列表中的一个项目的产品:

              (2 * 3 * 4)
(1)         *     (3 * 4)
(1 * 2)     *         (4)
(1 * 2 * 3)

答案 1 :(得分:-2)

那么他们究竟想要这些产品呢?例如,我们的解决方案中是否有产品1 * 1?如果是这样,你不能将数组中的每个数字乘以第一个然后完成吗?

或者您可以成对乘以,例如: 1 * 22 * 33 * 1 这可以使用mod运算符在数组中添加两个元素来完成。

Sudo代码:

for i = 0 to array.length print array[i] * array [i+1 % array.length]