数组中三个整数的最大乘积求解:初始化错误问题咨询
解决数组三数最大乘积的初始化问题
这问题我之前踩过一模一样的坑!初始化极值变量时用固定值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
相关产品推荐
相关产品推荐

