题目
给定一个整数列表 nums ,且 nums 中至少含有3个整数,请在列表中找出由三个数组成的最大乘积,并输出这个乘积。
例如:
给定一个列表:[1, 2, 3],返回结果:6
给定一个列表:[1, 2, -3, -3, 0],返回结果:18
实现思路1
- 使用
排序
的方式来实现,但时间复杂度为 O(nlog(n)) - 先对 nums 进行排序,排序后就可获取到 nums 中最小的数 min1、第二小的数 min2、最大的数 max1、第二大的数 max2、第三大的数 max3
- 最大乘积只会有2种组合情况:max1 * max2 * max3、max1 * min1 * min2(因为 min1、min2均为负数时,相乘可变为正数),从而可以得到最大乘积。
代码实现1
def maximumProduct(nums):
nums.sort()
return max(nums[0] * nums[1] * nums[-1], nums[-3] * nums[-2] * nums[-1])
实现思路2
- 不使用排序,直接遍历一次列表即可,时间复杂度O(n)
- 定义 min1、min2 为一个无穷大的数,所有数都比它们小;定义 max1、max2、max3 为一个无穷小的数,所有数都比它们大
- 遍历过程中,如果当前整数小于 min1 ,那么将 min1 置为当前整数,同时需将 min2 置为原来的 min1 ;如果当前整数大于等于 min1 且小于 min2 , 那么将 min2 置为当前整数即可
- 遍历过程中,如果当前整数大于 max1,那么将 max1 置为当前整数,同时需将 max2、max3 置为原来的 min1、max2;如果当前整数小于等于 max1 且大于 max2,那么将 max2 置为当前整数,同时需将 max3 置为原来的 max2;如果当前整数小于等于 max2 且大于 max3,那么将 max3 置为当前整数即可
代码实现2
def maximumProduct(nums):
min1, min2 = float("inf"), float("inf") # 定义一个无穷大的数,所有数都比 inf 小
max1, max2, max3 = float("-inf"), float("-inf"), float("-inf") # 定义一个无穷小的数,所有数都比 -inf 大
for num in nums:
if num < min1:
min1, min2 = num, min1
elif num < min2:
min2 = num
if num > max1:
max1, max2, max3 = num, max1, max2
elif num > max2:
max2, max3 = num, max2
elif num > max3:
max3 = num
num_product1 = max1 * max2 * max3
num_product2 = max1 * min1 * min2
return num_product1 if num_product1 > num_product2 else num_product2
更多Python编程题,等你来挑战:Python编程题汇总(持续更新中……)