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]
.
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.)
方法一:除法
计算全部数字的乘积,然后分别除以num数组中的每一个数(需要处理数字0的情况)。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> result(nums.size(),0);
int count = 0;
int mult = 1;
for(int i = 0; i<nums.size();i++)
{
if(nums[i]!=0)
mult *= nums[i];
else
count++;
}
//2个及以上的0
if(count >1)
{
return result;
}
//1个0
else if(count == 1)
{
for(int i = 0; i<nums.size();i++)
{
if(nums[i] == 0)
result[i] = mult;
}
}
//没有0
else
{
for(int i = 0; i<nums.size();i++)
{
result[i] = mult/nums[i];
}
}
return result;
}
};
方法二:正反遍历数组
由于result[i] = (x0 * x1 * ... * xi-1) * (xi+1 * .... * xn-1),因此执行两次循环:
- 首先正向遍历数组,计算x0 ~ xi-1的乘积;
- 然后反向遍历数组,计算xi+1 ~ xn-1的乘积;
算法的时间复杂度O(n),空间复杂度O(1)。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int left = 1, right = 1;
vector<int> result(nums.size(), 1);
for (int i = 1; i<nums.size(); i++)
{
left *= nums[i - 1];
result[i] = left;
}
for (int i = nums.size() - 2; i >=0 ; i--)
{
right = right* nums[i + 1];
result[i] *= right;
}
return result;
}
};