板子:
(占坑)
Leetcode 238. 除自身以外数组的乘积
优化前:使用前后缀数组记录
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> pre(n, 1), suf(n, 1), ans(n, 0);
for(int i = 0; i < n; i ++)
pre[i] = (i==0?1:pre[i - 1]) * nums[i];
for(int i = n - 1; i >= 0; i --)
suf[i] = (i==(n - 1)? 1 : suf[i + 1]) * nums[i];
for(int i = 0; i < n; i ++)
ans[i] = (i==0?1:pre[i - 1]) * (i==(n-1)?1:suf[i + 1]);
return ans;
}
};
优化后:
先计算 pre,然后一边计算 suf,一边把 suf直接乘到 pre[i] 中。最后返回 pre。(注意:suf是从1开始累乘的)
题目说「输出数组不被视为额外空间」,所以该做法的空间复杂度为 O(1)。此外,这种做法比上面少遍历了一次。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> pre(n, 1);
// 计算出前缀和数组
for(int i = 1; i < n; i ++)
pre[i] = pre[i - 1] * nums[i - 1];
// 针对前缀和数组补上后缀计算部分即可
int suf = 1;
for(int i = n - 1; i >= 0; i --){
pre[i] = pre[i] * suf;
suf *= nums[i];
}
return pre;
}
};