剑指offer51:构建乘积数组B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1],不能使用除法

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 };
View Code

参考资料

https://blog.csdn.net/zjwreal/article/details/89054205

posted @ 2019-08-28 18:40  wxwreal  阅读(338)  评论(0编辑  收藏  举报