这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
三个数的最大乘积
问题描述
LeetCode628. 三个数的最大乘积
给定一个长度为 n 的无序数组 A ,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。
示例:
输入:nums = [1,2,3,4]
输出:24
分析问题
数组中三个数的最大乘积有以下二种情况。
- 如果数组中的元素全是非负数或者非正数,那么数组中最大的三个数相乘就是最大乘积。
- 如果数组中的元素既有正数也有负数,那么最大的乘积既可能是三个最大正数的乘积,也可能是两个最小负数(绝对值最大)和最大正数的乘积。
所以,我们只需要找出数组中最大的三个数以及最小的两个数,就可以求得结果。下面我们来看一下如何求解。最容易想到的方式就是先对数组进行降序排序,排好序的数组的前三位以及后两位就是要找的最大的三个数以及最小的两个数。
class Solution:
def maximumProduct(self,nums):
nums=sorted(nums)
n=len(nums)
return max(nums[0] * nums[1] * nums[n-1], nums[n - 3] * nums[n - 2] * nums[n-1])
该算法的时间复杂度是O(nlogn),其中n为数组的长度。排序需要O(nlogn)的时间。
空间复杂度是O(logn),主要是排序的开销。
其实我们也可以扫描一遍数组,就可以求出这五个数,如下所示。
import sys
class Solution:
def maximumProduct(self,nums):
#最小和第二小
min1=min2=sys.maxsize
#最大、第二大、第三大
max1=max2=max3=-sys.maxsize-1
for x in nums:
if x < min1:
min2=min1
min1=x
elif x<min2:
min2=x
if x>max1:
max3=max2
max2=max1
max1=x
elif x>max2:
max3=max2
max2=x
elif x>max3:
max3=x
return max(max1*max2*max3,max1*min1*min2)
该算法的时间复杂度是O(n),空间复杂度是O(1)。