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