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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM