题目描述:给定长度为 n 的整数数组 nums
,其中 n > 1,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入:[1,2,3,4]
输出:[24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。
解法一
思路:用rear[]保存从后往前累乘的结果,nums[]保存从前往后累乘的结果,然后前后拼凑
/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function (nums) {
var rear = [];
var output = [];
var len = nums.length;
var mul = 1;
for(var i = len - 1; i > 0; i--) { //从后往前累乘
mul *= nums[i];
rear[len - 1 - i] = mul;
}
mul = 1;
for(var i = 0; i < len - 1; i++) { //从前往后累乘
mul *= nums[i];
nums[i] = mul;
}
for(var i = 0; i < len; i++) {
if(i == 0) {
output[i] = rear[len - 2];
}
else if(i == len - 1) {
output[i] = nums[len - 2];
}
else {
output[i] = nums[i - 1] * rear[len - i - 2];
}
}
return output;
};
解法二
思路:数组分别进行前后累乘,然后拼凑起来。
/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function (nums) {
var output = [1];
var len = nums.length;
var mul = 1;
for (var i = 0; i < len - 1; i++) {
mul *= nums[i];
output.push(mul);
}
mul = 1;
for(var i = len - 1; i > 0; i--) {
var j = i;
mul *= nums[i];
output[j - 1] *= mul;
}
return output;
};