转自https://blog.csdn.net/quzhongxin/article/details/47183965
题目描述
给定一个数组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(n^2)的解法
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> result;
int len = A.size();
if(len < 1) return result;
for(int i = 0; i < len; i++)
{
int temp = 1;
for(int j = 0; j < len; j++)
{
if(j == i) continue;
temp *= A[j];
}
result.push_back(temp);
}
return result;
}
};
如果可以使用除法,那还可以每次乘一个数,除以一个数,以降低时间复杂度。
时间复杂度O(n),空间复杂度O(n)的解法
使用一个数组,保存元素组某位置 i 前的所有元素的乘积,另外一个数组,保存 i 后所有元素的乘积,
最后这两个数组相乘。
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> result;
int len = A.size();
if(len < 1) return result;
int* C = new int[len];
int* D = new int[len];
C[0] = 1;
D[len-1] = 1;
for(int i = 1; i < len; i++)
{
C[i] = C[i - 1] * A[i - 1];
D[len - 1 - i] = D[len - i] * A[len - i];
}
for(int i = 0; i < len; i++)
{
int temp = C[i] * D[i];
result.push_back(temp);
}
return result;
}
};