给定一个整数数组arrayofints
,找到最高的积Highestproduct
,您可以从三个整数中得到。整数的输入数组将始终至少有三个整数。
所以我从arrayofints
中弹出了三个数字,并将它们插入highestproduct
:
Highestproduct = arrayofints[:2]
for item in arrayofints[3:]:
If min(Highestproduct) < item:
Highestproduct[highestproduct.index(min(Highestproduct))] = item
如果min
的highestproduct
小于项:用当前数替换最低数。
这最终会得到最高的产品,但显然有更好的解决方案。我的方法怎么了?我的解决方案是O(n)吗?
跟踪两个最小元素和三个最大元素,答案应该是
min1 * min2 * max1
或max1 * max2 * max3
。要得到3个整数的最大乘积,我们必须选择3个最大元素。但是有一个陷阱,我们可以用2个最小的整数替换3个最大元素中的最小元素中的2个。如果两个最小的int都是负的,则它们的乘积是正的,因此
min1 * min2
可能大于max2 * max3
(其中max2
和max3
是数组中3个最大元素中最小的2个)。这将在
O(n)
时间内运行。这里是一个C++程序实现,程序运行时间为O(n):
在一个包含正整数和负整数的列表中,最大的组合可以是最小的负整数、第二个最小的负整数、最大的正整数或最大的正整数、第二个最大的正整数和第三个最大的正整数
例如,
-5,-1,1,2,3
的列表应该返回15,但是当列表中只有负值时,这不起作用,与其选择最小的负整数,大数组合实际上是三个最大的负值,例如:-5,-4,-3,-2,-1
应该返回-6。编写代码的简单方法是只存储三个最大的正值(将0视为正值)三个最小的负值和三个最大的负值,然后我们尝试这九个数字的所有组合,得到最大值,这只需要
O(n)
时间和O(1)
空间。相关问题 更多 >
编程相关推荐