数组除自身以外的乘积算法出错排查(附代码及测试用例)
数组元素乘积问题
问题描述
给定整数数组nums,返回一个数组answer,其中answer[i]等于nums中除nums[i]之外所有元素的乘积。
nums的任何前缀或后缀的乘积都保证能放入32位整数中。- 必须编写时间复杂度为
O(n)且不使用除法操作的算法。
示例1:
输入: nums = [1,2,3,4] 输出: [24,12,8,6]
示例2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
约束条件:
- 2 <= nums.length <= 105
- -30 <= nums[i] <= 30
nums的任何前缀或后缀的乘积都保证能放入32位整数中。
**进阶问题:**能否在O(1)额外空间复杂度下解决该问题?(输出数组不计入空间复杂度分析的额外空间。)
错误代码及测试情况
提交的代码
class Solution: def productExceptSelf(self, arr: List[int]) -> List[int]: a=[1 for i in range(len(arr))] product_left=1 for i in range(len(arr)): a[i] = product_left*a[i-1] product_left *= arr[i] product_right=1 for i in range(len(arr)-1,-1,-1): a[i]*=product_right product_right*=arr[i] return a
测试对比
- 测试输入:
[1,2,3,4] [-1,1,0,-3,3]
- 实际输出:
[24,12,8,12] [0,0,-9,0,0]
- 预期输出:
[24,12,8,6] [0,0,9,0,0]
问题分析与修正方案
错误原因
- 左乘积逻辑错误:第一个循环中
a[i] = product_left*a[i-1]的写法完全偏离了左乘积的计算目标。正确逻辑是a[i]应该存储nums[0]到nums[i-1]的乘积,初始product_left为1时,i=0的左乘积就是1,之后每一步用当前product_left赋值给a[i],再更新product_left乘以nums[i]。原代码错误地将a[i]与前一个位置的结果相乘,导致左乘积被重复计算。 - 数值偏差问题:左乘积的错误直接导致后续和右乘积相乘时出现数值错误,比如示例1最后一个元素的结果翻倍,示例2中出现符号错误。
修正后的代码
from typing import List class Solution: def productExceptSelf(self, arr: List[int]) -> List[int]: n = len(arr) a = [1] * n # 计算左乘积:a[i] 存储 arr[0..i-1] 的乘积 product_left = 1 for i in range(n): a[i] = product_left product_left *= arr[i] # 计算右乘积并直接合并到结果数组中 product_right = 1 for i in range(n-1, -1, -1): a[i] *= product_right product_right *= arr[i] return a
验证说明
- 输入
[1,2,3,4],输出[24,12,8,6],与预期一致。 - 输入
[-1,1,0,-3,3],输出[0,0,9,0,0],与预期一致。 - 代码仅使用输出数组存储中间结果,未额外开辟其他数组空间,满足进阶问题
O(1)额外空间复杂度的要求。
内容的提问来源于stack exchange,提问作者Vishav Singla
相关产品推荐
相关产品推荐

