返回

借力打力,巧夺乘积!前端解题利器助你攻克题号238

前端

作为前端开发人员,我们不仅要掌握前端技术,还要具备扎实的数据结构和算法功底。为了帮助大家提高刷题能力,我们特地为大家准备了这道题号为238的题目:除自身以外数组的乘积。这道题看似简单,但想要彻底理解并给出高效的解决方案,还需要一定的技巧和思维方式。

题目

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外的所有元素的乘积。

示例 1:

输入:nums = [1,2,3,4]
输出:[24,12,8,6]

示例 2:

输入:nums = [-1,1,0,-3,3]
输出:[0,0,9,0,0]

思路剖析

这道题乍一看有些棘手,但仔细分析后,我们可以发现问题的关键在于如何高效地计算出除某个元素之外的所有元素的乘积。为了解决这个问题,我们可以使用一个辅助数组 left,其中 left[i] 存储的是从索引 0 到索引 i-1 的所有元素的乘积,另一个辅助数组 right,其中 right[i] 存储的是从索引 i+1 到索引 n-1 的所有元素的乘积。这样,我们只需要通过简单的计算,就能得到 output[i] 的值:

output[i] = left[i] * right[i]

代码实现

/**
 * 给定一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外的所有元素的乘积。
 *
 * 示例 1:
 * 输入:nums = [1,2,3,4]
 * 输出:[24,12,8,6]
 *
 * 示例 2:
 * 输入:nums = [-1,1,0,-3,3]
 * 输出:[0,0,9,0,0]
 *
 * @param {number[]} nums
 * @return {number[]}
 */
const productExceptSelf = (nums) => {
  const n = nums.length;
  const left = new Array(n).fill(1);
  const right = new Array(n).fill(1);
  const output = new Array(n).fill(0);

  // 计算 left 数组
  for (let i = 1; i < n; i++) {
    left[i] = left[i - 1] * nums[i - 1];
  }

  // 计算 right 数组
  for (let i = n - 2; i >= 0; i--) {
    right[i] = right[i + 1] * nums[i + 1];
  }

  // 计算 output 数组
  for (let i = 0; i < n; i++) {
    output[i] = left[i] * right[i];
  }

  return output;
};

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。
  • 空间复杂度:O(n),其中 n 是数组 nums 的长度。

结语

除自身以外数组的乘积这道题看似简单,但想要彻底理解并给出高效的解决方案,还需要一定的技巧和思维方式。通过这道题的讲解,希望大家能够对数组乘积的计算方法有更深入的理解。前端开发人员不仅要掌握前端技术,还要具备扎实的数据结构和算法功底,才能在前端开发领域取得更大的成就。