1.题目描述
给定一个数组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]。不能使用除法。
2.问题描述
假设:
// 1 a2 a3 a4
// a1 1 a3 a4
// a1 a2 1 a4
// a1 a2 a3 1
可以看出来,这个数组B分成两部分,分别是左下角和右上角。先计算左下角的连乘,再计算右上角连乘,循环两次就可以的到数组B的值。
3.源代码
vector<int> multiply(const vector<int>& A) {
int size = A.size();
if(size == 0)
return vector<int>();
vector<int> B(size, 1);
// 1 a2 a3 a4
// a1 1 a3 a4
// a1 a2 1 a4
// a1 a2 a3 1
//左下半区,i是下标
int temp = 1;
for(int i = 1; i < size; ++i)
{
temp *= A[i - 1];
B[i] = temp;
}
//右上半区
temp = 1;
for(int i = size - 2; i >= 0; --i)
{
temp *= A[i + 1];
B[i] *= temp;
}
return B;
}