给定一系列整数arrayofints
,找到最高乘积Highestproduct
,您可以从三个整数中获得。 int的输入数组总是至少有三个整数。
所以我已经从arrayofints
弹出了三个号码并将其粘贴在highestproduct
中:
Highestproduct = arrayofints[:2]
for item in arrayofints[3:]:
If min(Highestproduct) < item:
Highestproduct[highestproduct.index(min(Highestproduct))] = item
如果min
highestproduct
小于项目:将最低数字替换为当前数字。
这最终会产生最高的产品,但显然有更好的解决方案。我的方法有什么问题?我的解决方案是O(n)吗?
答案 0 :(得分:62)
跟踪两个最小元素和三个最大元素,答案应为min1 * min2 * max1
或max1 * max2 * max3
。
要获得3个整数的最大乘积,我们必须选择3个最大元素。然而,有一个问题,我们可以用2分钟的整数替换2个最小的3个最大元素中的2个。如果两个最小的整数都为负数,则其积为正数,因此min1 * min2
可能大于max2 * max3
(其中max2
和max3
是数组中3个最大元素中最小的2个)。
这将在O(n)
时间内运行。
答案 1 :(得分:2)
这个问题有一些问题,在一个涉及正负int的列表中,最大的组合可能是最小的负值,第二个最小的负值,最大的正值或最大的正值,第二大的正值和第三个值;
例如,-5,-1,1,2,3
的列表应该返回15,但是当列表中只有负值时,这不起作用,而不是选择最小的负整数,大的组合实际上是三个最大的负值,例如:-5,-4,-3,-2,-1
应返回-6。对此进行编码的简单方法就是存储三个最大的正值(将0视为正值),
当我们通过数组时,三个最小的负值和三个最大的负值,然后我们尝试这九个数字的所有组合并获得最大值。这只需要O(n)
时间和O(1)
空间。
答案 2 :(得分:2)
这是程序的C ++实现,运行时间为O(N):
#define size 5
int A[size] = {5,4,5,10,-6};
int highest_product_of_3()
{
int highest = max(A[0],A[1]);
int lowest = min(A[0],A[1]);
int highestProductOf2 = A[0]*A[1];
int lowestProductOf2 = A[0]*A[1];
int highestProductOf3 = A[0]*A[1]*A[2];
for (int i=2;i<size;i++)
{
int current = A[i];
// Max of 3 values:
// highest_product_of_3 OR
// current*highestProductOf2 OR
// current*lowestProductOf2
highestProductOf3 = max(max(highestProductOf3, current*highestProductOf2),
current*lowestProductOf2);
highestProductOf2 = max(max(highestProductOf2, current*highest),
current*lowest);
lowestProductOf2 = min(min(lowestProductOf2, current*highest),
current*lowest);
highest = max(highest, current); // update highest
lowest = min(lowest, current); // update lowest
}
return highestProductOf3;
}
答案 3 :(得分:1)
如果您先排序Sub RFC_DEEP_TABLE()
Dim sapConn As Object
Set sapConn = CreateObject("SAP.Functions")
If sapConn.Connection.Logon(0, False) <> True Then
MsgBox "Cannot Log on to SAP"
End If
Dim objRfcFunc As Object
Set objRfcFunc = sapConn.Add("STFC_DEEP_TABLE")
With objRfcFunc
.Exports.Item("IMPORT_TAB").value("STR") = "X" 'Objectvariable oder With-Blockvariable nicht festgelegt
End With
If objRfcFunc.Call = False Then
MsgBox objRfcFunc.Exception
End If
End Sub
,则最差的运行时间为arrayofints
而不是O(n log n)
(即不太快)。但代码真的很短。那么朋友之间有什么O(n)
呢?
log n
(要清楚的是,排序不需要明确跟踪三个最高数字,三个最低数字 - 这些是类似排序的操作,但比排序整个列表便宜。)
答案 4 :(得分:1)
这种方法基本上适用于任意数量的元素,更不用说3.想法是先对数组进行排序,然后取最后一个和第二个最后一个元素的乘积。这可以在python中实现:
def pr(arr, n):
n = len(arr)
arr.sort()
a = {}
r = arr[n-1]
s = arr[n-2]
return {r, s}
arr = [1, 4, 3, 6, 7, 0]
q = pr(arr, 6)
print(q)
这将打印出产品最高的元素集。