238. Product of Array Except Self
Description:
Given an array nums of n integers where n > 1
, return an array output such that output[i]
is equal to the product of all the elements of nums except nums[i]
.
Difficulty:Medium
Example:
Input: [1,2,3,4]
Output: [24,12,8,6]
Note: Please solve it without division and in O(n).
Follow up:
Could you solve it with constant space complexity? (The output array does not count as extra space for the purpose of space complexity analysis.)
方法1:两次循环,乘法变除法
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
第一次循环将所有元素的乘积product_all
求出来
第二次循环用总乘积除以自己,填充进数组
关键点
因为数组中可能出现0 ,需要分情况讨论,三种情况:无0,一个0,多个0
1.如果无0,对应位置填product_all / nums[i]
2.如果有一个0,需要记录除0以外的乘积product_expect_zero
3.如果有多个0,返回全0数组
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int product_all = 1, product_expect_zero = 1, num_zero = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0)
num_zero++;
else
product_expect_zero *= nums[i];
product_all *= nums[i];
}
vector<int> res(nums.size(), 0);
if (num_zero > 1)
return res;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0)
res[i] = product_expect_zero;
else
res[i] = product_all / nums[i];
}
return res;
}
};
方法2:双向相乘,优解
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
考虑每个元素位置的结果是除自己之外的乘积,这个乘积可以分成两个部分,左边和右边,最终结果是左边乘积和右边乘积的乘积,
关键点:
用两个变量记录实时变化的左右乘积,因为是除自己以外的乘积,所以先乘左右乘积,再更新左右乘积
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int left = 1, right = 1, len = nums.size();
vector<int> res(nums.size(), 1);
for (int i = 0; i < nums.size(); i++) {
res[i] *= left;
left *= nums[i];
res[len - 1 - i] *= right;
right *= nums[len - 1 - i];
}
return res;
}
};