🔗 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);}
};