
思路
首先很容易想到暴力法:创建一个长度为n的结果数组,对于每个数以此下标进行划分,分别计算左右两边的乘积然后进行相乘。但是这个会超时!
因此需要优化,需要用前缀法进行优化。我们分别通过left去维护数组左侧的乘积去更新结果数组,然后在通过right去维护右侧的值的过程中,更新res并最后返回。
python
from typing import List
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
n = len(nums) # 数组长度
res = [1] * n # 初始化结果数组,每个位置设为1(乘法单位)
# 第一步:从左到右,计算每个位置左边所有数的乘积
left = 1 # 初始左乘积为1
for i in range(n):
res[i] = left # 把左边的乘积放入结果中
left *= nums[i] # 更新左乘积,乘上当前nums[i]
# 第二步:从右到左,再乘上右边所有数的乘积
right = 1 # 初始右乘积为1
for i in range(n - 1, -1, -1): # 从右向左遍历
res[i] *= right # 把右边的乘积乘到结果上
right *= nums[i] # 更新右乘积,乘上当前nums[i]
return res # 返回最终结果