一.题目描述:
给定一个数组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]。不能使用除法。
二.思路
如果使用两层循环当然很好求解,时间复杂度为O(lenA^2),但是面试中一般会要求时间复杂度为O(lenA)
于是可以看一下当前B[i]的求解是不是可以找到与前面的B[i-1]的关系,使用动态规划的思想,这是优化时间复杂度常用的技巧,包括寻找数可以分成几个质数的个数,时间优化都是这种思想。
我们画出一个图可以看到:
图片来自:
https://blog.csdn.net/u012429555/article/details/90106409
可以看到,下三角和上三角的元素之间都是递增的关系,很明显下一行的值可以根据上一行的结果乘以1个数得到。那么我们可不可以使用两个列表C和D分别存储每行的结果,然后再计算B呢?当时是可以的,但是增加了额外的空间开销C和D,空间复杂度为O(lenA)
那么我们可不可以根据递推的思路,先求解B的下三角,再求解上三角呢,当然是可以的。
三.python代码实现
class Solution:
def multiply(self, A):
# write code here
if len(A)<=1:
return []
B=[1 for i in range(len(A))]
B[1]=A[0]
for i in range(2,len(A)):
B[i]=B[i-1]*A[i-1]
Temp=1
for j in range(len(A)-2,-1,-1):
Temp=Temp*A[j+1]
B[j]=B[j]*Temp
return B
参考链接: