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 思路和方法
由于B[i] = (A[0] * A[1] * … * A[i-1]) * (A[i+1] * … * A[n-1])
因此执行两趟循环:
第一趟正向遍历数组,计算A[0] ~ A[i-1]的乘积,left[i]=A[0]*A[1]*…*A[i-1]
第二趟反向遍历数组,计算A[i+1] ~ A[n-1]的乘积, right[i] = A[i+1]*A[i+2]*…*A[n-1]
最后结果B[i]=left[i]*right[i]。
第一步:B[0] = 1;
for(int i=1; i<len; ++i){
B[i] = B[i-1] * A[i-1];} // A[0]* A[1]*..* A[i-1]。
由于第二步求的是(A[i+1]*……*A[n-1]),所以
for(int i = len-2;i>=0; --i){
tmp *= A[i+1];
B[i] *= tmp; // * (A[i+1]*..*A[n-1])。
3 C++核心代码
1 class Solution { 2 public: 3 vector<int> multiply(const vector<int>& A) { 4 int len = A.size(); 5 vector<int> B(len); 6 if(len <= 1) return B; 7 8 B[0] = 1; 9 for(int i=1; i<len; ++i){ 10 B[i] = B[i-1] * A[i-1]; // A[0]* A[1]*..* A[i-1] 11 } 12 13 int tmp = 1; 14 for(int i = len-2;i>=0; --i){ 15 tmp *= A[i+1]; 16 B[i] *= tmp; // * (A[i+1]*..*A[n-1]) 17 } 18 return B; 19 } 20 };
参考资料
https://blog.csdn.net/zjwreal/article/details/89054205