文章目录题目思路和代码思路参考题解错误题目思路和代码思路自己尝试的超时了学的题解的。原题解在这里有图解非常推荐学习https://leetcode.cn/problems/product-of-array-except-self/solutions/11472/product-of-array-except-self-shang-san-jiao-xia-sa/?envTypestudy-plan-v2envIdtop-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]这里i1是倒过来遍历了对应前面的res[i - 1]那就不是保存的前面的乘积了因此需要一个临时变量tmp来记录tmp*nums[i1];res[i]tmp*res[i];参考题解/** * param {number[]} nums * return {number[]} */varproductExceptSelffunction(nums){// 思路自身可以看作1全部写下来就可以发现1成对角线分为上下两个三角。// 因此可以迭代算两次一次算下三角一次算上三角直接乘进res数组即可constresnewArray(nums.length).fill(1);lettmp1;// 先算下三角for(leti1;inums.length;i){res[i]nums[i-1]*res[i-1];}// 再算上三角for(letinums.length-2;i0;i--){tmp*nums[i1];// tmp辅助记录上三角迭代的乘积因为res已经存了前面的乘积不可以直接用res[i]tmp*res[i];}returnres;};错误自己一开始写的还是太朴实了过样例还行提交就非常意内地超时了。贴在这里记录一下吧。/** * param {number[]} nums * return {number[]} */varproductExceptSelffunction(nums){constres[];for(leti0;inums.length;i){consttmpnums.shift();res.push(nums.reduce((acc,num)num*acc));nums.push(tmp);}returnres;};