力扣 238. 除自身以外数组的乘积
🔗 https://leetcode.cn/problems/product-of-array-except-self
题目
- 给定一个数组,返回除了当前元素,其余所有元素的乘积
- 不能用除法,所有数字的乘积都在 int 32 位之内
思路
- solution 1
- presum 的思路变成 prefix_product 和 suffix_product 的计算,当前元素的答案,就是对应的 prefix_product 和 suffix_product 的乘积
- solution 2
- 进阶要求仅用额外的 O(1) 空间,那遍顺序遍历一遍,逆序遍历一遍,记录对应的乘积,更新当前元素的答案
代码
class Solution {
public:
vector<int> solution1(vector<int>& nums) {
int n = nums.size();
vector<int> suffix_product(n+1), prefix_product(n+1);
suffix_product[n] = prefix_product[0] = 1;
for (int i = 0; i < nums.size(); i++) {
prefix_product[i + 1] = prefix_product[i] * nums[i];
suffix_product[n - i -1] = suffix_product[n - i] * nums[n - i -1];
}
vector<int> ans(n);
for (int i = 0; i < n; i++) {
ans[i] = prefix_product[i] * suffix_product[i+1];
}
return ans;
}
vector<int> solution2(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n, 1);
int pre_prod = 1;
for (int i = 0; i < n; i++) {
ans[i] = pre_prod;
pre_prod *= nums[i];
}
int suf_prod = 1;
for (int i = n - 1; i >= 0; i--) {
ans[i] *= suf_prod;
suf_prod *= nums[i];
}
return ans;
}
vector<int> productExceptSelf(vector<int>& nums) {
//return solution1(nums);
return solution2(nums);
}
};