Python编程题36--三个数的最大乘积

题目

给定一个整数列表 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编程题汇总(持续更新中……)

上一篇:HttpHelper


下一篇:Python - Get leaves count in a dictionary