题目描述:
给定一个数组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]
。
不能使用除法。
样例
输入:[1, 2, 3, 4, 5]
输出:[120, 60, 40, 30, 24]
思考题:
- 能不能只使用常数空间?(除了输出的数组之外)
分析:
题目意思是让我们求数组乘积除以当前元素得到的数组,但是不能使用除法,也不要额外的空间。采取以下做法来解决:比如1 2 3 4 5,B[2] = 1 * 2 * 4 * 5,可以发现B[i]等于左边部分乘积乘以右边部分乘积,分开计算即可。
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
int n = A.size();
if(!n) return vector<int>();
vector<int> v(n);
for(int i = 0, p = 1;i < n;i++){
v[i] = p;
p *= A[i];
}
for(int i = n - 1,p = 1;~i;i--){
v[i] *= p;
p *= A[i];
}
return v;
}
};