题目
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
解题思路:
将数组从左边开始累乘得到每个位置的左边的所有的值的乘积;
同样从右边开始,累乘可以得到每个位置的右边的所有值的乘积;
然后将对应的位置的左边乘积以及右边乘积乘起来得到最后的结果。
具体代码如下:
class Solution
{
public:
vector<int> productExceptSelf(vector<int>& nums)
{
vector<int> res(nums.size());
vector<int> left(nums.size());
left[0] = 1;
vector<int> right(nums.size());
right[nums.size() - 1] = 1;
for (int i = 1; i < nums.size(); i++)
{
left[i] = left[i - 1] * nums[i - 1];
}
for (int i = nums.size() - 2; i != -1; i--)
{
right[i] = right[i + 1] * nums[i + 1];
}
for (int i = 0; i < nums.size(); i++)
{
res[i] = left[i] * right[i];
}
return res;
}
};
虽然最终在O(n)的时间复杂度下可以得到最终的结果,然是却同样占用了O(n)的空间复杂度,不符合进阶要求。
修改之后代码如下:
class Solution
{
public:
vector<int> productExceptSelf(vector<int>& nums)
{
vector<int> res(nums.size());
res[0] = 1;
int tmp = *(nums.end() - 1);
res[nums.size() - 1] = 1;
for (int i = 1; i < nums.size(); i++)
{
res[i] = res[i - 1] * nums[i - 1];
}
for (int i = nums.size() - 2; i != -1; i--)
{
res[i] *= tmp;
tmp *= nums[i];
}
return res;
}
};
此时满足进阶要求。