给定一个数组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]。不能使用除法。
观察下公式,你会发现,B[i]公式中没有A[i]项,也就是说如果可以使用除法,就可以用公式B[i]=A[0]*A[1]*.....*A[n-1]/A[i]来计算B[i],但是题目要求不能使用,因此我们只能另想办法。
现在要求不能使用除法,只能用其他方法。一个直观的解法是用连乘n-1个数字得到B[i]。显然这个方法需要O(n*n)的时间复杂度。
好在还有更高效的算法。可以把B[i]=A[0]*A[1]*.....*A[i-1]*A[i+1]*.....*A[n-1]。看成 A[0]*A[1]*.....*A[i-1] 和 A[i+1]*.....A[n-2]*A[n-1] 两部分的乘积。
其实就是说迭代着让A[i]赋值为1,在对A的整行求乘积。可以用下图来表示:
# -*- coding:utf-8 -*-
class Solution:
def multiply(self, A):
# write code here
B = []
if len(A) == 0:
return B
else:
for i in range(len(A)):
# 不能真的破坏A,计算完A[i]还得保存回去
tmp = A[i]
A[i] = 1
# 把处理完的A乘积结果添加到B中
B.append(reduce(lambda x,y:x*y, A))
A[i] = tmp
return B
在python3中如果使用reduce需要先导入
from functools import reduce
reduce函数,reduce函数会对参数序列中元素进行累积。
reduce函数的定义:
reduce(function, sequence [, initial] ) -> value
function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。
第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。