给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
class Solution {
public:
/**************************
A.size=5;
B[0]=A[1]A[2]A[3]A[4]
B[1]=A[0]A[2]A[3]A[4]
B[2]=A[0]A[1]A[3]A[4]
B[3]=A[0]A[1]A[2]A[4]
B[4]=A[0]A[1]A[2]A[3]
***************************/
vector<int> multiply(const vector<int>& A) {
vector<int> B;
B.resize(A.size());
int n = A.size();
for (int i = 0; i < n;++i) {
B[i] = 1;
for (int j = 0; j <n; ++j) {
if(i!=j)
B[i] *= A[j];
}
}
return B;
}
};
int main() {
Solution res;
vector<int> A,B;
for (int i = 1; i < 5; ++i) {
A.push_back(i);
}
B = res.multiply(A);
for (int i = 0; i < B.size(); ++i) {
cout << "B[" << i << "]=" << B[i] << std::endl;
}
cout << "done" << endl;
}
网上较好思路:
链接:https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46?answerType=1&f=discussion
来源:牛客网
public:
vector<int> multiply(const vector<int>& A) {
int len=A.size();
vector<int> B(len);
int res=1;
for(int i=0;i<len;i++){
B[i]=res;
res*=A[i];
}
res=1;
for(int i=len-1;i>=0;i--){
B[i]*=res;
res*=A[i];
}
return B;
}
};
//B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]
//从左到右算 B[i]=A[0]*A[1]*...*A[i-1]
//从右到左算B[i]*=A[i+1]*...*A[n-1]
本文介绍了一种不使用除法计算数组元素乘积的算法。通过两次遍历,先计算每个元素左侧所有元素的乘积,再计算右侧所有元素的乘积,最终得到每个元素对应的乘积结果。
1824

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



