☰
【leetcode】238.除了自身以外数组的乘积js
2026/10/2 17:12:51 网站建设 项目流程

文章目录

  • 题目
  • 思路和代码
    • 思路
    • 参考题解
  • 错误

题目

思路和代码

思路

自己尝试的超时了,学的题解的。
原题解在这里,有图解非常推荐学习:https://leetcode.cn/problems/product-of-array-except-self/solutions/11472/product-of-array-except-self-shang-san-jiao-xia-sa/?envType=study-plan-v2&envId=top-100-liked

以下记录一下题解学习过程:

难的地方在于不能用除法,不然乘一遍然后再挨个除一遍就出来了。
不能用除法那就先尝试把所有的情况列出来,由于要排除自身,因此可以把自身当成1,然后写出来:

有点抽象就看具体的例子:

那怎么计算上下两个三角?发现下三角每次多加的数其实就是nums数组正向遍历一遍的顺序,因此先算下三角,算上三角倒回来再乘一次就好了。

准备res数组(图上是b),初始化为和nums一样的长度并且全部填充1,用一个for循环i从1开始(res[0]不用是因为本来就是1),每个元素的计算是:

res[i]=nums[i-1]*res[i-1];
  • nums[i - 1]是新加进来的数;
  • res[i - 1]是保存的前面的乘积。

下三角算完算上三角,直接乘进res数组里。也是用for循环,不一样的地方在于不能和上面一样直接进res数组,前面可以这么做是因为数组全是1,现在如果还用res[i + 1](这里i+1是倒过来遍历了,对应前面的res[i - 1])那就不是保存的前面的乘积了,因此需要一个临时变量tmp来记录:

tmp*=nums[i+1];res[i]=tmp*res[i];

参考题解

/** * @param {number[]} nums * @return {number[]} */varproductExceptSelf=function(nums){// 思路:自身可以看作1,全部写下来就可以发现1成对角线分为上下两个三角。// 因此可以迭代算两次,一次算下三角一次算上三角,直接乘进res数组即可constres=newArray(nums.length).fill(1);lettmp=1;// 先算下三角for(leti=1;i<nums.length;i++){res[i]=nums[i-1]*res[i-1];}// 再算上三角for(leti=nums.length-2;i>=0;i--){tmp*=nums[i+1];// tmp辅助记录上三角迭代的乘积,因为res已经存了前面的乘积不可以直接用res[i]=tmp*res[i];}returnres;};

错误

自己一开始写的还是太朴实了,过样例还行,提交就非常意内地超时了。
贴在这里记录一下吧。

/** * @param {number[]} nums * @return {number[]} */varproductExceptSelf=function(nums){constres=[];for(leti=0;i<nums.length;i++){consttmp=nums.shift();res.push(nums.reduce((acc,num)=>num*acc));nums.push(tmp);}returnres;};

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询