题目描述:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
*
* 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
*
* 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
解题思路:
没有头绪,记录一下解题方法
- 一个数 = 除自己以外的所有数的乘积,约等于就是自己左边的所有数字乘以自己右边的所有数字。所以记录一个左边乘积的所有结果,再记录一个右边乘积的结果,每一个下标为i的数字代表原数组i下标的数字的左边乘积/右边乘积。
- 空间O(1)就是那要返回的数组装上面的左边乘积数组,然后定义一个变量保存右边乘积,倒着遍历。
解法一:
function productExceptSelf(nums) {
let left = [1];
let right: number[] = [];
let res:number[] = [];
right[nums.length - 1] = 1;
for (let i = 1; i < nums.length; i++) {
left[i] = left[i - 1] * nums[i - 1];
}
for (let i = nums.length - 2; i > -1; i--) {
right[i] = right[i + 1] * nums[i + 1];
}
for (let i = 0; i < nums.length; i++) {
res[i] = left[i] * right[i];
}
return res;
}
用时:
// Your runtime beats 11.6 % of typescript submissions
// Your memory usage beats 53.6 % of typescript submissions (53.8 MB)
解法二:O(1)
function productExceptSelf(nums) {
let res = [1];
for (let i = 1; i < nums.length ; i++){
res[i] = res[i - 1] * nums[i - 1];
}
let R = 1;
for (let i = nums.length - 1; i > -1; i--) {
res[i] = R * res[i];
R = R * nums[i];
}
return res;
}
用时:
//Your runtime beats 90.4 % of typescript submissions
// Your memory usage beats 82.4 % of typescript submissions (52.3 MB)