我在最近的一次采访中遇到了这个问题。 给定一个数组,找到可以获得的最大乘积乘以数组中的任何3个数字。 我提出的解决方案是,
Sort the array
Multiply the 3 largest number.
这是O(nlogn)
该问题是否有O(n)
解决方案?
答案 0 :(得分:7)
您可以保留前三个,而不是排序所有值,O(3n)
O(n)
一次通过这样做可能比三次通过更有效。
这样做的一种方法是对3的数组进行插入排序,每次丢弃最低值。 (你可以从数组中的最低值开始)
您还可以使用一系列if / else比较来实现此功能,以更新3个变量。
消极情绪怎么样?
唯一的复杂因素是,如果你可以有负值,例如5 * -4 * -4 > 5 * 5 * 3
由于这个原因,搜索三个最大的和两个最负面的是有意义的。您可以查看largest * the next two largest
或largest * the two most negative is bigger
。
如果他们都是负面的怎么办?
在这种情况下,您还需要三个最小的负值,以使产品最接近正无穷大。
答案 1 :(得分:3)
您可以在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但仍然是恒定的时间