【发布时间】:2011-09-22 23:30:48
【问题描述】:
有一个整数数组,比如说 3,5,7,9。您应该创建另一个数组并填充它,以便第二个数组的第 0 个位置应该是第一个数组中所有数字的乘积,不包括第 0 个位置的数字,这意味着它应该是 5x7x9(不包括 3),索引处的数字第二个数组的 1 将是 3x7x9 的乘积(不包括 5)。
我想到的第一个答案是有 2 个 for 循环,这将导致 O(n2) 的时间复杂度。后来我想通了:
将第一个数组(3x5x7x9)中的所有数字相乘,在填充第二个数组时,我将这个乘积除以该位置的数字。如果我填充第 0 个位置,则除以 3,如果我填充第 1 个位置,则除以 5,依此类推。这会将复杂度从 O(n2) 降低到可能 O(2n)。
但是面试官说不允许除法。除了将不同的可能倍数存储在某种数据结构中并在填充时使用它之外,我想不出其他任何东西。我放弃了,但当被问及答案时,他说他将保持 2 个向前和向后倍数的数组。当被问及解决方案的空间复杂度问题时,他表示可以进行优化。
【问题讨论】:
-
一个小小的技术问题:O(2n) 正好是 O(n)。
-
也许他的意思是在某种意义上它是最优的,因为该问题的空间复杂度为
O(n),并且该解决方案添加了另一个O(n),总共仍然是O(n)。 -
@Charlie 知道你的意思...他是说 O(2n) 与 O(3n) 相同与 O(1000000n) 与 O(n) 相同。
-
问题是面试官的空间优化还是他的解决方案的工作方式?他的解决方案相当简单……
-
我想我可以对此有所了解:面试官没有想到您更简单,更优雅的解决方案,因此不允许划分。他们是否也不允许在代码中进行划分,并且每个人都必须围绕这种任意限制进行编码?
标签: algorithm