题目描述
给定一个数组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]。不能使用除法。
题目详情:
也即是Bi对应的位置为1即可,相当于A0*A1...An-1的连乘temp,具体计算Bi的时候将上述的连乘temp除于Ai即可;但是题目要求不能使用除法;
解法1:
O(n^2)
两个for循环实现
class Solution {
public:
vector<int> multiply(const vector<int>& A)
{
int n = A.size();
vector<int> B(n);
if (!A.empty())
{
for (int i = 0; i <= n - 1; i++)
{
int mult = 1;
for (int j = 0; j <= n - 1; j++)
{
if (j != i)
mult *= A[j];
}
B[i]= mult;
}
}
return B;
}
};
解法:2:
为此分析上述的表格可知:
Bi的计算可以分为两步操作:
1)计算对角线下面的值Bi
2)使用上面的Bi再次计算对角线上面的值
class Solution {
public:
vector<int> multiply(const vector<int>& A)
{
int length = A.size();
vector<int> B(length);
if(length != 0 )
{
B[0] = 1;
//计算下三角也即是对角线的左下边
for(int i = 1; i < length; i++)
{
B[i] = B[i-1] * A[i-1];
}
int temp = 1;
//计算上三角也即是对角线的右上角
for(int j = length-2; j >= 0; j--)
{
temp *= A[j+1];
B[j] *= temp;
}
}
return B;
}
};
参考:【1】https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46
是否可以使用动态规划?