剑指offer:面试题52——构建乘积数组
题目:给定一个数组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]。不能使用除法。
思路见注释:
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> B;
int n=A.size();
if(n<1) return B;
for(int i=0;i<n;i++) //这里要注意先给vector初始化,防止数组越界和非法访问
B.push_back(1);
//B[i]值为行列式一行的连乘积,包含前半部分和后半部分两部分,中间以1分隔,形如
//B0 1 A1 A2 A... AN-1
//B1 A1 1 A2 A... AN-1
//...
//BN-1 A0 A1 ...AN-2 1
B[0]=1; //下三角第一个值给定为1
//先计算下三角行列式
for(int i=1;i<n;i++) //因为B[0]已知,所以从B[1]算起,每次的B[i]都是上次的B[i-1],即
B[i]=B[i-1]*A[i-1]; //A[0]*A[1]*...*A[i-1]再乘以A[i]所得
int temp=1; //用来记录上三角行列式中所得的一行的连乘积值
for(int j=n-2;j>=0;j--)
{
temp*=A[j+1];
B[j]*=temp; //上下三角行列式的一行相乘
}
return B;
}
};