题目:
给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
思路:
题目要求不能使用除法,若使用连乘,则时间复杂度O(n^2);
把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-1]两部分乘积
让C[i]= A[0]*A[1]*...*A[i-1], D[i] = A[i+1]*...*A[n-1], 那么, C[i] 可以由上至下计算C[i] = C[i - 1] * A[i - 1], 同时D[i]可以由下至上计算 = D[i +1] * A[i + 1]
代码实现:
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
int len = A.size();
vector<int> result;
if(len > 1)
{
/*---先计算左下角的乘积---*/
result.push_back(1);
for(int i = 1; i < len; i++)
{
result.push_back(result[i - 1] * A[i - 1]);
}
/*---在计算右上角的乘积---*/
int temp = 1;
for(int i = len - 2; i >= 0; i--)
{
temp *= A[i + 1];
result[i] *= temp;
}
}
return result;
}
};