题目描述
给定一个数组 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]。不能使用除法。
分析
- 方法一:暴力解法双层循环,时间复杂度O( n 2 n^2 n2);空间复杂度O(1)。
- 方法二:构建前向乘积数组 C [ i ] = A [ 0 ] ∗ A [ 1 ] ∗ . . . ∗ A [ i − 1 ] C[i]=A[0]*A[1]*...*A[i-1] C[i]=A[0]∗A[1]∗...∗A[i−1],即 C [ i ] = C [ i − 1 ] ∗ A [ i − 1 ] C[i]=C[i-1]*A[i-1] C[i]=C[i−1]∗A[i−1];构建后向乘积数组 D [ i ] = A [ n − 1 ] ∗ A [ n − 2 ] ∗ . . . A [ n − i + 1 ] D[i]=A[n-1]*A[n-2]*...A[n-i+1] D[i]=A[n−1]∗A[n−2]∗...A[n−i+1],即 D [ i ] = D [ i + 1 ] ∗ A [ i + 1 ] D[i]=D[i+1]*A[i+1] D[i]=D[i+1]∗A[i+1];通过 C [ i ] , D [ i ] C[i],D[i] C[i],D[i]来求 B [ i ] B[i] B[i]: B [ i ] = C [ i ] ∗ D [ i ] B[i]=C[i]*D[i] B[i]=C[i]∗D[i]时间复杂度:O(n);空间复杂度O(n)。但是C与D数组的临时存储可全程用B来代替,因此可将空间复杂度降为O(1)。
代码
- 方法一:
# -*- coding:utf-8 -*-
class Solution:
def multiply(self, A):
# write code here
B = []
length = len(A)
for i in range(length):
num = 1
for j in range(length):
if i!=j:
num *= A[j]
B.append(num)
return B
- 方法二:(优)
# -*- coding:utf-8 -*-
class Solution:
def multiply(self, A):
# write code here
if not A:
return []
length = len(A)
B = [1]*length
for i in range(length-1):
B[i+1] *= B[i]*A[i]
temp = 1
for i in range(length-2, -1, -1):
temp *= A[i+1]
B[i] *= temp
return B