题目描述
给定一个数组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
]
=
∏
j
=
0
n
−
1
A
[
j
]
/
A
[
i
]
B[i] = \prod_{j=0}^{n-1} A[j] /A[i]
B[i]=∏j=0n−1A[j]/A[i] 。
如果使用暴力求解,遍历B和A数组,时间复杂度为 O(N^2)
下面考虑一种时间复杂度为O(N)的解法:
将B[i]分解为两部分的乘积: A [ 0 ] × . . . A [ i − 1 ] A[0] \times...A[i-1] A[0]×...A[i−1] 和 A [ i + 1 ] × . . . A [ n − 1 ] A[i+1] \times...A[n-1] A[i+1]×...A[n−1]
代码
class Solution {
public:
// 时间复杂度 O(N)
vector<int> multiply(const vector<int>& A) {
int len = A.size();
vector<int> B(len);
if(len <= 1) return B;
B[0] = 1;
for(int i=1; i<len; ++i){
B[i] = B[i-1] * A[i-1]; // A[0]* A[1]*..* A[i-1]
}
int tmp = 1;
for(int i = len-2;i>=0; --i){
tmp *= A[i+1];
B[i] *= tmp; // * (A[i+1]*..*A[n-1])
}
return B;
}
};