题目描述:给定一个数组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]位置上面的元素没有参与运算,因此,我们将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]两部分的乘积就是B[i]。如下图的矩阵:
其中,下三角的每一行B[i]=A[i-1]*B[i-1];上三角计算B[i]之前,因为从低向上时,首先要将B[n-1]位置的置“1”,然后进行计算B[i]=A[i+1]*B[i]
代码实现如下:
1.
vector<int> multiply(const vector<int>& A)
{
vector<int> B;
if(A.empty())
return B;
int length=A.size();
B.push_back(1);
for(int i=1; i<length;i++)
{
B.push_back(A[i-1]*B[i-1]);
}
int tmp=1;
for(int i=length-2; i>=0; i--)
{
tmp*=A[i+1];
B[i]*=tmp;
}
return B;
}
2.
void multiply(const vector<double>& array1, vector<double>& array2)
{
int length1 = array1.size();
int length2 = array2.size();
if (length1 <= 0)
return;
if (length1 == length2&&length2 < 1)
{
array2[0] = 1;
for (int i = 1; i < length1; i++)
{
array2[i] = array1[i - 1] * array2[i - 1];
}
double tmp = 1;
for (int i = length1 - 2; i >= 0; i--)
{
tmp *= array1[i + 1];
array2[i] *= tmp;
}
}
}