【剑指offer】65.构建乘积数组
总目录:
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](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。
(注意:规定 B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2])
对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。
数据范围:1≤n≤10 ,数组中元素满足 ∣val∣≤10
2.问题分析
一个乘积可以由较小的乘积叠加而来,也可以由较大的乘积作除的来,本题禁止使用除法,只能通过小乘积累乘得到。
1 class Solution { 2 public: 3 vector<int> multiply(const vector<int>& A) { 4 vector<int> ret(A.size(), 1); 5 //从左到右 6 for (int i = 1; i < A.size(); i++) { 7 ret[i] = ret[i - 1] * A[i - 1]; 8 } 9 10 //从右到左 11 int temp = 1; 12 for (int i = A.size() - 1; i >= 0; i--) { 13 ret[i] *= temp; 14 temp *= A[i]; 15 } 16 17 return ret; 18 } 19 };
对于左侧的乘积集合,B[n]=B[n-1]*A[n-1],
对于右侧的乘积集合,C[n]=C[n+1]*A[n+1];
将B和C集合逐元素相乘即得到返回值。
双向遍历法:
如果为了节省空间可以不用保存B和C的中间值,通过2次遍历、逐步迭代完成计算。
3.代码实例
双向遍历