Topic:
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
Example_1:
输入: [1,2,3]
输出: 6
Example_2:
输入: [1,2,3,4]
输出: 24
Solution_1(多次遍历):
不断对数组中的数取样和排列
判断最大的值后直接返回
运算效率极低不推荐
Code_1:
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
n = len(nums)
return max(nums[i] * nums[j] * nums[b]
for i in range(n) for j in range(i + 1, n) for b in range(j + 1, n))
Solution_2(贪心):
首先将数组进行排序
对于全是负数和全是正数的情况:
仅需返回最大的三个数的乘积
对于数组中既有正数又有复数的情况:
若有三个正数以上,那么三个正数的乘积有可能为最大
若至少有两个负数数,那么最小的两个负数相乘会得到一个较大的正数
那么这个正数与最大的正数的乘积同样可能为最大
Code_2:
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
nums.sort()
return max(nums[-1] * nums[-2] * nums[-3], nums[-1] * nums[0] * nums[1])
Solution_3(线性扫描):
在理解了第二种解决方法的基础上对第二种进行优化
先找出前三位中的数按大到小排列为max_1, max_2, max_3
之后找出前两位中的数从大到小找出min_2, min_1
然后在遍历的过程中进行判断
不断对其中的值进行更新
最后同样是输出第二种方法中的最大值
Code_3:
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
max_1, max_2, max_3 = sorted([nums[0], nums[1], nums[2]])
min_2, min_1 = sorted([nums[0], nums[1]])
for i in nums:
if i > max_1:
max_3 = max_2
max_2 = max_1
max_1 = i
elif i <= max_1 and i >= max_2:
max_3 = max_2
max_2 = i
elif i <= max_2 and i >= max_3:
max_3 = i
if i <= min_1:
min_2 = min_1
min_1 = i
elif i >= min_1 and i <= min_2:
min_2 = i
return max(min_1 * min_2 * max_1, max_1 * max_2 * max_3)