构建乘积数组
题目
给定一个数组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[i]=A[0]*A[1]*.....*A[i-1]*A[i+1]*.....*A[n-1]。看成A[0]*A[1]*.....*A[i-1]和A[i+1]*.....A[n-2]*A[n-1]两部分的乘积。
不妨设定C[i]=A[0]*A[1]*...*A[i-1],D[i]=A[i+1]*...*A[n-2]*A[n-1]。C[i]可以用自上而下的顺序计算出来,即C[i]=C[i-1]*A[i-1]。类似的,D[i]可以用自下而上的顺序计算出来,即D[i]=D[i+1]*A[i+1]。
class Solution { public: vector<int> constructArr(vector<int>& a) { if (a.empty()) { return {}; } int tmp = 1; vector<int> b(a.size(), 0); for (int i = 0; i <= a.size() - 1; ++i) { b[i] = tmp;//b[2] = a[1]; b[3] = a[1] * a[2]; tmp *= a[i]; } tmp = 1; for (int i = a.size() - 1; i >= 0; --i) { b[i] *= tmp; tmp *= a[i]; } return b; } };