给定一个数组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[0]~A[i - 1] 的乘积 和 A[i + 1]~A[n - 1]的乘积。
可以用两个for循环,一次计算0~i-1的乘积,一次计算i+1~n-1的乘积。
注意:A[0]*A[0-1] 按 1算 A[n - 1 + 1]*A[n - 1]也按 1 算。
精简的代码:
vector<int> multiply2(const vector<int>& A) { if(A.size() < 2) return vector<int>(); vector<int> B; int value = 1; B.push_back(value); for(int i = 1; i < A.size(); i++) { value *= A[i - 1]; B.push_back(value); } value = 1; for(int i = A.size() - 2; i >= 0; i--) { value *= A[i + 1]; B[i] *= value; } return B; }
我自己写的,用了过多的冗余空间。
vector<int> multiply(const vector<int>& A) { if(A.size() < 2) return vector<int>(); vector<int> B; vector<int> M0(A.size(), 1), Mn(A.size(), 1); M0[0] = A[0]; Mn.back() = A.back(); for(int i = 1; i < A.size() - 1; i++) M0[i] = M0[i - 1] * A[i]; for(int i = A.size() - 2; i >= 1; i--) Mn[i] = Mn[i + 1] * A[i]; for(int i = 0; i < A.size(); i++) { int b = ((i - 1 < 0) ? 1 : M0[i - 1]) * ((i + 1 >= A.size()) ? 1 : Mn[i + 1]); B.push_back(b); } return B; }