题目描述:
给定一个数组 A [ 0 , 1 , . . . , n − 1 ] A[0,1,...,n-1] A[0,1,...,n−1],请构建一个数组 B [ 0 , 1 , . . . , n − 1 ] B[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 ] B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] B[i]=A[0]∗A[1]∗...∗A[i−1]∗A[i+1]∗...∗A[n−1]。不能使用除法。(注意:规定 B [ 0 ] = A [ 1 ] ∗ A [ 2 ] ∗ . . . ∗ A [ n − 1 ] , B [ n − 1 ] = A [ 0 ] ∗ A [ 1 ] ∗ . . . ∗ A [ n − 2 ] B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2] B[0]=A[1]∗A[2]∗...∗A[n−1],B[n−1]=A[0]∗A[1]∗...∗A[n−2];)
示例:
输入: [1,2,3,4,5]
输出: [120,60,40,30,24]
根据题意可知,B的每个位置的元素为A除去当前位置的所有位置元素的乘积,因此只需要构建一个索引列表,然后每次求B的元素时就从索引列表中除去当前索引,然后将其他位置对应元素相乘添加到B中。
# -*- coding:utf-8 -*-
class Solution:
def multiply(self, A):
# write code here
if A == None:
return None
B = []
for i in range(len(A)):
num = 1
for n in A[:i] + A[i + 1:]:
num *= n
B.append(num)
return B
上面的代码牛客可以通过,但是leetcode会超时。正确的方式是使用左右乘积数组法,如下所示:
class Solution:
def constructArr(self, a: List[int]) -> List[int]:
n = len(a)
L, R = [1] * n, [1] * n
for i in range(1, n):
L[i] = L[i - 1] * a[i - 1]
for j in reversed(range(n - 1)):
R[j] = R[j + 1] * a[j + 1]
for i in range(n):
L[i] = L[i] * R[i]
return L