You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组中三个整数的最大乘积求解:初始化错误问题咨询

解决数组三数最大乘积的初始化问题

这问题我之前踩过一模一样的坑!初始化极值变量时用固定值0确实很容易在全负数组的场景下翻车,咱们一步步理清楚怎么解决。

问题根源分析

你遇到的nums = [-1, -2, -3]场景,正确的最大乘积是两个最小负数(绝对值最大的-3和-2)乘以最大的负数(-1),也就是(-3)*(-2)*(-1) = -6。但你把min_neg和min_neg_1初始化为0后,因为数组里所有元素都比0小,这两个变量根本不会被更新,始终保持0。最后计算时用了0参与乘积,结果自然变成0了。

正确的初始化方案

核心思路是:不要用固定的数值(比如0)初始化极值变量,而是用能覆盖所有可能元素范围的边界值,或者直接用数组的初始元素来初始化。这里推荐两种可靠的方式:

方式1:用无穷值初始化(最通用)

用正无穷(float('inf'))初始化最小的两个数,负无穷(float('-inf'))初始化最大的三个数。这样不管数组里的元素是正、负还是零,遍历过程中都能正确更新这些极值:

def maximumProduct(nums):
    min1 = min2 = float('inf')  # 最小的两个数
    max1 = max2 = max3 = float('-inf')  # 最大的三个数
    
    for num in nums:
        # 更新最小的两个数
        if num < min1:
            min2 = min1
            min1 = num
        elif num < min2:
            min2 = num
        
        # 更新最大的三个数
        if num > max1:
            max3 = max2
            max2 = max1
            max1 = num
        elif num > max2:
            max3 = max2
            max2 = num
        elif num > max3:
            max3 = num
    
    # 最大乘积的两种可能:三个最大数的乘积,或两个最小数(可能是负)乘最大数
    return max(max1 * max2 * max3, min1 * min2 * max1)

测试你的输入[-1,-2,-3]时,min1=-3,min2=-2,max1=-1,两种乘积结果都是-6,返回正确值。

方式2:用数组初始元素初始化(避免无穷值)

如果不想用无穷值,可以先取数组的前几个元素初始化极值变量,再从后续元素开始遍历更新:

def maximumProduct(nums):
    # 先处理前三个元素,初始化最大的三个数和最小的两个数
    sorted_first_three = sorted(nums[:3])
    min1, min2 = sorted_first_three[0], sorted_first_three[1]
    max3, max2, max1 = sorted_first_three[0], sorted_first_three[1], sorted_first_three[2]
    
    for num in nums[3:]:
        # 更新最小的两个数
        if num < min1:
            min2 = min1
            min1 = num
        elif num < min2:
            min2 = num
        
        # 更新最大的三个数
        if num > max1:
            max3 = max2
            max2 = max1
            max1 = num
        elif num > max2:
            max3 = max2
            max2 = num
        elif num > max3:
            max3 = num
    
    return max(max1 * max2 * max3, min1 * min2 * max1)

这种方式同样能正确处理全负数组,因为初始化时用的是数组本身的负数,不会引入0这个干扰值。

额外小技巧:排序法(更简洁)

如果不纠结时间复杂度,直接排序数组后取两种情况的最大值会更简单:

def maximumProduct(nums):
    nums.sort()
    # 情况1:三个最大数的乘积;情况2:两个最小数(可能负)乘最大数
    return max(nums[-1] * nums[-2] * nums[-3], nums[0] * nums[1] * nums[-1])

这种写法代码量少,也能轻松处理全负数组的场景。

内容的提问来源于stack exchange,提问作者mourinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:07:18