解法一:前后缀乘积数组
通过计算得到前后缀乘积数组,之后累乘即可。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> pre(n+1, 1), post(n+1, 1), ans(n);
for(int i=0;i<n;i++)
{
pre[i+1] = pre[i]*nums[i];
post[n-i-1] = post[n-i]*nums[n-i-1];
}
for(int i=0;i<n;i++)
{
ans[i] = pre[i]*post[i+1];
}
return ans;
}
};
空间压缩:去掉两个数组,直接在原数组操作。
样例学习:对于样例 [1,2,3,4],答案是 [24,12,8,6]
对应的前后缀数组分别为 [1,1,2,6,24], [24,24,12,4,1],通过观察可以发现,前缀数组前4个元素和后缀数组后四个元素的乘积即为答案。这也是普通解法的做法。
利用这一特性进行优化,
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n, 1);
int tmp = 1;
for(int i=1;i<n;i++)
{
ans[i] = tmp*nums[i-1]; tmp *= nums[i-1];
}
tmp = 1;
for(int i=n-2;i>=0;i--)
{
ans[i] *= tmp*nums[i+1]; tmp*= nums[i+1];
}
return ans;
}
};