題目
給定一個整數列表 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編程題匯總(持續更新中……)