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編程題彙總(持續更新中……)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章