除自身以外数组的乘积
数组 前缀积题目描述
给定一个整数数组 nums,返回一个数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
要求:
- 不允许使用除法。
- 时间复杂度为
O(n)。
思路分析
如果直接对每个位置重新遍历一遍数组并计算乘积,时间复杂度会达到 O(n^2),不满足题目要求。
更高效的做法是把每个位置的答案拆成两部分:
- 该位置左侧所有元素的乘积
- 该位置右侧所有元素的乘积
只要把这两部分相乘,就得到了当前位置“除自身以外”的乘积。
具体来说:
- 第一趟遍历,计算每个位置左侧所有元素的乘积,并存入结果数组
answer。 - 第二趟从右向左遍历,用变量
right维护当前位置右侧所有元素的乘积,再与answer[i]相乘。
这样就能在不使用除法的前提下,用两次线性遍历完成计算。
算法步骤
- 初始化结果数组
answer,长度与nums相同,初始值全部为1。 - 从左到右遍历数组,让
answer[i]表示nums[i]左侧所有元素的乘积。 - 定义变量
right = 1,表示当前位置右侧元素乘积的初始值。 - 从右到左遍历数组,将
answer[i] *= right。 - 每处理完一个位置后,更新
right *= nums[i],供下一个位置使用。
示例代码
复杂度分析
- 时间复杂度:
O(n),其中n是数组长度。只需要两次线性遍历。 - 空间复杂度:
O(1),如果不计返回数组answer,只额外使用了一个变量right。
示例演示
以 nums = [1, 2, 3, 4] 为例:
第一趟遍历后,answer 中保存的是每个位置左侧元素乘积:
第二趟从右向左遍历:
最终结果为:
[24, 12, 8, 6]