给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
输入: [1,2,3,4,5]
输出: [120,60,40,30,24]
思路
1. forward正向 [占位1, 1, 1 * 2, 1 * 2 * 3, 1 * 2 * 3 * 4]
2. backward反向 [占位1, 5, 5 * 4, 5 * 4 * 3, 5 * 4 * 3 * 2][::-1]
3. forward[0] * backward[0], forward[1] * backward[1], .......
class Solution:
def constructArr(self, a: List[int]) -> List[int]:
if len(a) == 0: return []
if len(a) == 1: return a
if len(a) == 2: return a[::-1] # [3, 2] return [2, 3]
# [1, 2, 3, 4]
# forward = 正向推理一次 [占位1, 1, 1 * 2, 1 * 2 * 3]
# backward = 反向推理一次 [4 * 3 * 2 ,4 * 3, 4, 占位1]
# forward[0] * backward[0], forward[1] * backward[1], forward[2] * backward[2] ....
forward, backward = [1], [1]
tmp = 1
for i in range(0, len(a) - 1):
tmp *= a[i]
forward.append(tmp)
tmp = 1
for j in range(len(a) - 1, 0, -1):
tmp *= a[j]
backward.append(tmp)
backward = backward[::-1]
result = []
for i in range(len(a)): result.append(forward[i] * backward[i])
return result