51. 构建乘积数组

题目描述
给定一个数组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]。不能使用除法。


思路
思路一:
两重循环,在遍历数组A的时候,A[i]赋值为1,计算B[i]。时间复杂度为
思路二:
时间复杂度为
可以把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]项将B[i]分为两部分的乘积。效果相当于是个对角矩阵。

第一个for循环用来计算上图1范围的数,第二个for循环用来计算上图2范围的数。


代码实现
思路一:

 -*- coding:utf-8 -*-
class Solution:
    def multiply(self, A):
        # write code here
        length = len(A)
        B = []
        if(length == 0):
            return B
        for i in range(length):
            temp = A[i]
            A[i] = 1
            Bi = 1
            for j in A:
                Bi *= j
            B.append(Bi)
            A[i] = temp
        return B

思路二:

# -*- coding:utf-8 -*-
class Solution:
    def multiply(self, A):
        # write code here
        length = len(A)
        if(length == 0):
            return []
        import copy   
        B = copy.copy(A)
        B[0] = 1
        # 计算下三角连乘
        for i in range(1,length):
            B[i] =  B[i-1] * A[i-1]
        # 计算下三角连乘
        temp = 1
        for j in range(length-2,-1,-1):
            temp *= A[j+1]
            B[j] *= temp
        return B