【数组】力扣628:三个数的最大乘积
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例1:
输入:nums = [-1,-2,-3]
输出:-6
示例2:
输入:nums = [1,2,3,4]
输出:24
自以为是的解答 - 排序
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
nums.sort(reverse = True) # 降序排列
return nums[0] * nums[1] * nums[2]
如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。
但是!没有考虑到数组中有正数有负数的情况:(1)只有一个负数,乘积最大值为排序数组前三个数相乘;(2)有两个及以上的负数,乘积最大值为排序数组最后两个负数与第一个正数相乘。
归纳以上4种情况,最大值为取max(排序数组前三个数相乘,排序数组最后两个负数与数组第一个正数相乘)
改进版:
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
nums.sort(reverse = True)
return max(nums[0] * nums[1] * nums[2], nums[-1] * nums[-2] * nums[0])
如果是升序排列:
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])
时间复杂度:O(nlogn),内置排序算法消耗
空间复杂度:O(logn),内置排序算法消耗
扫描查找
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
a = b = c = float('-inf')
d = e = float('inf')
for i, num in enumerate(nums):
# 更新最大三个数
if num > a:
a, b, c = num, a, b
elif num > b:
b, c = num, b
elif num > c:
c = num
# 更新最小两个数
if num < d:
d, e = num, d
elif num < e:
e = num
return max(d * e * a, a * b * c)
作者:yim-6
链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers/solution/python3-liang-chong-fang-fa-ji-suan-san-nae0f/
代码可以再简单点:
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
min1, min2 = [float('inf')] * 2 # 两个负数最小值
max1, max2, max3 = [float('-inf')] * 3 # 三个最大正数值
for num in nums:
min1, min2, _ = sorted([min2, min1, num])
_, max1, max2, max3 = sorted([max1, max2, max3, num])
return max(min1 * min2 * max3, max1 * max2 * max3)
作者:boille
链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers/solution/tan-xin-zheng-ming-onshi-jian-by-boille-9kxv/
时间复杂度:O(n),扫描一遍即可。
空间复杂度:O(1),python 为方便条件判断进行排序操作消耗 O(n) 空间,C 代码中手动实现「三数排序」。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!