【LeetCode】238. 除自身以外数组的乘积
解题思路
该问题要求计算数组中每个元素除自身外的乘积,且不能使用除法。核心思路是通过两次遍历(前缀积与后缀积)来避免重复计算,实现时间复杂度 O(n) 和空间复杂度 O(1)(不考虑输出数组)。
关键步骤
- 前缀积计算:从左到右遍历数组,计算每个元素左侧所有元素的乘积并存入结果数组
answer。 - 后缀积计算:从右到左遍历数组,动态计算右侧元素的累积乘积,并与前缀积相乘更新
answer。 - 空间优化:复用
answer数组存储中间结果,仅用临时变量right存储右侧累积乘积。
代码实现
代码解析
- 初始化:创建结果数组
answer,长度为n。 - 前缀积填充(时间复杂度 O(n)):
answer[0]初始化为 1(第一个元素左侧无元素)。- 遍历时,每个
answer[i]等于前一个前缀积answer[i-1]与nums[i-1]的乘积。
- 后缀积计算(时间复杂度 O(n)):
- 从右向左遍历,变量
right累积右侧元素的乘积。 - 每次更新
answer[i]为前缀积与后缀积的乘积。
- 从右向左遍历,变量
- 空间优化:仅使用
right变量存储右侧累积乘积,无需额外数组。
示例测试
复杂度分析
- 时间复杂度:O(n),两次独立遍历数组。
- 空间复杂度:O(1)(不考虑输出数组)。若包含输出数组则为 O(n),但题目明确输出数组不计入空间复杂度。
关键点
- 避免除法:通过分解为左右乘积,规避除法带来的边界问题(如元素为 0)。
- 动态更新:第二次遍历时直接复用
answer数组,减少空间浪费。 - 边界处理:正确处理数组首尾元素的左右乘积(如
i=0时左侧无元素,i=n-1时右侧无元素)。

浙公网安备 33010602011771号