python-leetcode-628. 三个数的最大乘积

628. 三个数的最大乘积 - 力扣(LeetCode)

可以通过排序或线性扫描的方式找到三个数的最大乘积。这里提供一种高效的线性扫描方法,时间复杂度为 O(n):

思路:

  1. 找出数组中 最大的三个数,分别记为 max1max2max3

  2. 找出数组中 最小的两个数,分别记为 min1min2

  3. 计算可能的最大乘积:

    • 最大三个正数的乘积max1 * max2 * max3

    • 两个最小负数和最大正数的乘积min1 * min2 * max1

  4. 取两者的较大值。

代码实现:

def maximumProduct(nums):
    min1, min2 = float('inf'), float('inf')
    max1, max2, max3 = float('-inf'), float('-inf'), float('-inf')

    for num in nums:
        # 更新最大三个数
        if num > max1:
            max3, max2, max1 = max2, max1, num
        elif num > max2:
            max3, max2 = max2, num
        elif num > max3:
            max3 = num

        # 更新最小两个数
        if num < min1:
            min2, min1 = min1, num
        elif num < min2:
            min2 = num

    return max(max1 * max2 * max3, min1 * min2 * max1)

# 示例
nums = [1, 10, 2, 6, 5, 3]
print(maximumProduct(nums))  # 输出 300

复杂度分析:

  • 遍历一次数组 O(n) 计算 max1, max2, max3, min1, min2,然后常数时间计算最大乘积。

  • 总体时间复杂度:O(n)

  • 空间复杂度:O(1),只使用了常数额外空间。

这种方法比直接排序后取最大值的方法(O(nlog⁡n), 更高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值