索引请参考:系列目录
题目:
- 给定一个数组A[0,1,…,n-1],构建一个数组B[0,1,…,n-1],其中B中的元素B[ i ] = A[0] * A[1] * … * A[n - 1]。不能使用除法。(注:规定B[0] = A[1] * A[2]* …* A[n - 1],B[n - 1] = A[0] * A[1]* …* A[n - 2])
- 对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。
分析:
- 思路1:暴力法(具体请参考代码)
- 思路2:

left[i] = A[0] * A[1] * … * A[i - 1]
righr[i] = A[i + 1] * A[i + 2] * … * A[n - 1]
B[i] = left[i] * righr[i]
left[i + 1] = left[i] * A[i]
righr[i] = righr[i + 1] * A[i + 1]
思路1:
vector<int> multiply(const vector<int>& A) {
int size = A.size();
vector<int>B;
for(int i = 0;i < size; i++)
{
int result = 1;
for(int j = 0;j < size;j++)
{
if(i == j)
continue;
result *= A[j];
}
B.push_back(result);
}
return B;
}
牛客运行结果:

思路2:
vector<int> multiply(const vector<int>& A) {
vector<int>B(A.size(),1);
for(int i = 1;i < A.size();i++)
B[i] = B[i -1] * A[i - 1];//left
int temp = 1;
for(int i = A.size() - 2;i >= 0;i--)
{
temp *= A[i + 1];
B[i] *= temp;
}
return B;
}
牛客运行结果:

评注:本人对牛客运行结果持怀疑态度,原因:
思路1的时间复杂度为O(n^2),思路2时间复杂度为O(n).
当测试数据足够大时,算法速率会有明显差异的。
582

被折叠的 条评论
为什么被折叠?



