238.除自身以外数组的乘积
链接:238.除自身以外数组的乘积
难度:Medium
标签:数组、前缀和
简介:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
题解 1 - typescript
- 编辑时间:2020-06-04
- 执行用时:132ms
- 内存消耗:42.7MB
- 编程语言:typescript
- 解法介绍:虽通过但使用了除法不符合题目要求
function productExceptSelf(nums: number[]): number[] {
  let zeroIndex = nums.indexOf(0);
  if (zeroIndex === -1) {
    let sum = 1;
    for (const num of nums) sum *= num;
    return nums.map(v => sum / v);
  } else if (nums.includes(0, zeroIndex + 1)) {
    return nums.map(v => 0);
  } else {
    let sum = 1;
    for (const num of nums) sum *= num === 0 ? 1 : num;
    return nums.map(v => (v === 0 ? sum : 0));
  }
}
题解 2 - typescript
- 编辑时间:2020-06-04
- 执行用时:96ms
- 内存消耗:42MB
- 编程语言:typescript
- 解法介绍:根据题解 2,利用输出数组,先存入左值再累乘右值,使空间变 O(1)
function productExceptSelf(nums: number[]): number[] {
  const len = nums.length;
  let ans: number[] = [1];
  for (let i = 1; i < len; i++) ans[i] = ans[i - 1] * nums[i - 1];
  let r = nums[len - 1];
  for (let i = len - 2; i >= 0; i--) {
    ans[i] *= r;
    r *= nums[i];
  }
  return ans;
}
题解 3 - typescript
- 编辑时间:2020-06-04
- 执行用时:132ms
- 内存消耗:42.1MB
- 编程语言:typescript
- 解法介绍:储存左值与右值,res[i]=l[i]*r[i]
function productExceptSelf(nums: number[]): number[] {
  const len = nums.length;
  let l: number[] = [];
  let r: number[] = [];
  l[0] = 1;
  for (let i = 1; i < len; i++) l[i] = l[i - 1] * nums[i - 1];
  r[len - 1] = 1;
  for (let i = len - 2; i >= 0; i--) r[i] = r[i + 1] * nums[i + 1];
  return nums.map((_, i) => l[i] * r[i]);
}