- Product of Array Except Self
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].
Example
For example, given [1,2,3,4], return [24,12,8,6].
Challenge
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
Notice
Solve it without division and in O(n).
解法1:
思路:用两个array: forward 和 backward。
代码如下:
class Solution {
public:
/**
* @param nums: an array of integers
* @return: the product of all the elements of nums except nums[i].
*/
vector<int> productExceptSelf(vector<int> &nums) {
int len = nums.size();
if (len == 0) return vector<int>();
if (len == 1) return nums;
vector<int> result(len, 0);
vector<int> forward(len, 0);
vector<int> backward(len, 0);
forward[0] = nums[0];
for (int i = 1; i < len; ++i) {
forward[i] = forward[i - 1] * nums[i];
}
backward[len - 1] = nums[len - 1];
for (int i = len - 2; i >= 0; --i) {
backward[i] = backward[i + 1] * nums[i];
}
for (int i = 1; i < len - 1; ++i) {
result[i] = forward[i - 1] * backward[i + 1];
}
result[0] = backward[1];
result[len - 1] = forward[len - 2];
return result;
}
};
解法2:一个array,直接基于return array操作。反向数组用一个变量代替即可。
代码如下:
class Solution {
public:
/**
* @param nums: an array of integers
* @return: the product of all the elements of nums except nums[i].
*/
vector<int> productExceptSelf(vector<int> &nums) {
int len = nums.size();
if (len == 0) return vector<int>();
if (len == 1) return nums;
vector<int> result(len, 1);
for (int i = 1; i < len; ++i) {
//note result[i] only records the forward product of i - 1
result[i] = result[i - 1] * nums[i - 1];
}
int backwardProduct = 1;
for (int i = len - 1; i >= 0; --i) {
result[i] = result[i] * backwardProduct;
backwardProduct *= nums[i];
}
return result;
}
};
二刷:
class Solution {
public:
/**
* @param nums: an array of integers
* @return: the product of all the elements of nums except nums[i].
*/
vector<int> productExceptSelf(vector<int> &nums) {
int n = nums.size();
vector<int> res(n, 1);
res[0] = nums[0];
for (int i = 1; i < n - 1; i++) {
res[i] = res[i - 1] * nums[i];
}
int backwardProd = 1;
for (int i = n - 1; i >= 1; i--) {
res[i] = res[i - 1] * backwardProd;
backwardProd *= nums[i];
}
res[0] = backwardProd;
return res;
}
};
本文探讨了在不使用除法的情况下,计算数组中每个元素的乘积,但排除当前元素的方法。通过两次遍历数组,一次从左到右记录前缀乘积,一次从右到左记录后缀乘积,最终得到所有元素的除自身外乘积。
454





