给定一个数组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;
if(A.size() == 0)
return b;
b.resize(A.size());
int end = A.size() - 1;
int tmp = 1;
//第一次前向累乘
b[0] = 1;
for(int i =0;i<A.size()-1;i++)
{
tmp *= A[i];
b[i+1] = tmp;
}
//第二次后向累乘
tmp = 1;
for (int i = end; i > 0; i--)
{
tmp *= A[i];
b[i-1] *= tmp;
}
return b;
}
};
方法二:除法
class Solution{
public:
int mult(const vector<int>& A ,int pos)
{
int result = 1;
for(int i = 0; i < pos; ++i)
{
result *= A[i];
}
for(int i = pos + 1; i < A.size(); ++i)
{
result *= A[i];
}
return result;
}
int decedt(const vector<int>& A,int *pos)
{
int count = 0;
for(int i = 0; i < A.size(); ++i )
{
if(A[i] == 0)
{
*pos = i;
count++;
}
}
return count;
}
vector<int> multiply(const vector<int>& A)
{
vector<int> res(A.size(),0);
int pos = -1;
int zero = decedt(A,&pos);
if(zero > 1)
{
return res;
}
if(zero == 1)
{
res[pos] = mult(A,pos);
return res;
}
int count = mult(A ,-1);
for(int i = 0; i < A.size(); ++i)
{
res[i] = count / A[i];
}
return res;
}
};