可以通过排序或线性扫描的方式找到三个数的最大乘积。这里提供一种高效的线性扫描方法,时间复杂度为 O(n):
思路:
-
找出数组中 最大的三个数,分别记为
max1
、max2
和max3
。 -
找出数组中 最小的两个数,分别记为
min1
和min2
。 -
计算可能的最大乘积:
-
最大三个正数的乘积:
max1 * max2 * max3
-
两个最小负数和最大正数的乘积:
min1 * min2 * max1
-
-
取两者的较大值。
代码实现:
def maximumProduct(nums):
min1, min2 = float('inf'), float('inf')
max1, max2, max3 = float('-inf'), float('-inf'), float('-inf')
for num in nums:
# 更新最大三个数
if num > max1:
max3, max2, max1 = max2, max1, num
elif num > max2:
max3, max2 = max2, num
elif num > max3:
max3 = num
# 更新最小两个数
if num < min1:
min2, min1 = min1, num
elif num < min2:
min2 = num
return max(max1 * max2 * max3, min1 * min2 * max1)
# 示例
nums = [1, 10, 2, 6, 5, 3]
print(maximumProduct(nums)) # 输出 300
复杂度分析:
-
遍历一次数组 O(n) 计算
max1, max2, max3, min1, min2
,然后常数时间计算最大乘积。 -
总体时间复杂度:O(n)
-
空间复杂度:O(1),只使用了常数额外空间。
这种方法比直接排序后取最大值的方法(O(nlogn), 更高效。