数组中3个数字的最大乘积

时间:2016-05-08 21:59:15

标签: java algorithm

我在最近的一次采访中遇到了这个问题。 给定一个数组,找到可以获得的最大乘积乘以数组中的任何3个数字。 我提出的解决方案是,

Sort the array
Multiply the 3 largest number.

这是O(nlogn)

该问题是否有O(n)解决方案?

4 个答案:

答案 0 :(得分:7)

您可以保留前三个,而不是排序所有值,O(3n) O(n)

一次通过这样做可能比三次通过更有效。

这样做的一种方法是对3的数组进行插入排序,每次丢弃最低值。 (你可以从数组中的最低值开始)

您还可以使用一系列if / else比较来实现此功能,以更新3个变量。

  

消极情绪怎么样?

唯一的复杂因素是,如果你可以有负值,例如5 * -4 * -4 > 5 * 5 * 3

由于这个原因,搜索三个最大的和两个最负面的是有意义的。您可以查看largest * the next two largestlargest * the two most negative is bigger

  如果他们都是负面的怎么办?

在这种情况下,您还需要三个最小的负值,以使产品最接近正无穷大。

答案 1 :(得分:3)

您可以在O(n)中执行以下操作:

  • 找出O(n)中的最大数字;从数组中删除数字(使其为零)
  • 找出O(n)中剩余数字中的最大数字;使它也为零
  • 在O(n)中找到剩余数字中的最大数字

你重复相同的O(n)循环三次,所以它是O(3 * n),它与O(n)相同,因为常量被忽略。

  

这不会迎合否定

修改此算法以使用负数相对容易。每次通过数组需要找到最大和最小的负值,所以最后你会得到三个大的正数P 0 ,P 1 ,P 2 和大负数N 0 ,N 1 ,N 2 ,按幅度按升序排列。现在你需要比较P 0 * P 1 * P 2 与N 1 * N 2 * P 2 ,然后选择较大的一个。

答案 2 :(得分:0)

此问题有O(n)时间复杂度解决方案,但这些只会根据数组的输入而发生,因为您可以阅读in this article

答案 3 :(得分:0)

你可以通过将数组A中的最大元素存储到3个B的数组中来执行此操作。

对于数组A中的每个元素n,如果n大于数组B中的任何元素,则将数组B元素替换为数组A元素。

最后将结果数组中的3个元素相乘。这是恒定的时间。这可能仍然是3n,因为你也在检查3的数组。

对于否定,它将是包含最小的2个元素。所以它可能是5n但仍然是恒定的时间