剑指Offer 66. 构建乘积数组(Easy)
题解
思路
代码
class Solution(object):
### 0907 直接遍历(超时)
# def constructArr(self, a):
# """
# :type a: List[int]
# :rtype: List[int]
# """
# ret_ls = []
# for i in range(len(a)):
# v = 1
# for j in range(len(a)):
# if j == i:
# continue
# v *= a[j]
# ret_ls.append(v)
# return ret_ls
### 0907 乘积数组法
def constructArr(self, a):
# 新建一个数组并初始化为全1(用于记录顺序值的累乘,即i左边值的累乘)
# 新建一个辅助变量初始化为1(用于记录逆序值的累乘,即i右边值的累乘)
b, tmp = [1] * len(a), 1
# 计算矩阵的下三角部分,b[0]只需计算i右边值的累乘即可
for i in range(1, len(a)): #
b[i] = b[i-1] * a[i-1] # 自上而下依次计算i左边的每个累乘值(此时b用于暂存)
# 计算矩阵的上三角部分,b[n-1]只需计算i左边值的累乘即可
for i in range(len(a)-2, -1, -1):
tmp *= a[i+1] # 自下而上依次计算i右边的每个累乘值
b[i] *= tmp # 左边的累乘值 * 右边的累乘值
return b