一.读懂题目
2.
二. 分析,推导解法,产生思路。
解题思路:(1)一次排序,最大乘积是前面3个正数,或者前面2个负数乘后面一个正数。
(2)一次遍历,以打擂台的方式,找到最大的三个正数和最小的两个负数。
三. 代码实现
def maximumProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 1. 一次遍历,以打擂台的方式,找到最大的三个正数和最小的两个负数。
pos_1, pos_2, pos_3 = [float('-inf')] * 3 # 三个最大正数值
neg_1, neg_2 = [float('inf')] * 2 # 两个负数最小值
for i, num in enumerate(nums) :
# 更新最大三个正数
if num > pos_1 :
pos_1, pos_2, pos_3 = num, pos_1, pos_2
elif num > pos_2 :
pos_1, pos_2, pos_3 = pos_1, num, pos_2
elif num > pos_3 :
pos_1, pos_2, pos_3 = pos_1, pos_2, num
# 更新最小的两个负数
if num < neg_1 :
neg_1, neg_2 = num, neg_1
elif num < neg_2 :
neg_1, neg_2 = neg_1, num
return max(pos_1*pos_2*pos_3, neg_1*neg_2*pos_1)
def maximumProduct1(self, nums):
# 2. 一次排序,最大乘积是前面3个正数,或者前面2个负数乘后面一个正数
nums = sorted(nums) # 从小到大
return max(nums[0]*nums[1]*nums[-1], nums[-1]*nums[-2]*nums[-3])