【leetcode】238.除了自身以外数组的乘积js

文章目录

题目

思路和代码

思路

自己尝试的超时了,学的题解的。

原题解在这里,有图解非常推荐学习: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),每个元素的计算是:

js 复制代码
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来记录:

js 复制代码
tmp *= nums[i + 1]; 
res[i] = tmp * res[i];

参考题解

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

错误

自己一开始写的还是太朴实了,过样例还行,提交就非常意内地超时了。

贴在这里记录一下吧。

js 复制代码
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {
    const res = [];
    for (let i = 0; i < nums.length; i++) {
        const tmp = nums.shift();
        res.push(nums.reduce((acc, num) => num * acc));
        nums.push(tmp);
    }
    return res;
};
相关推荐
坤坤子吖1 小时前
算法学习——高精度加减乘除
c++·笔记·学习·算法
CQU_JIAKE1 小时前
10.1[A]2267,磐久UMX【上下文128K,KVCache部分]
算法
朝朝辞暮i1 小时前
C++ 第 14 课:引用 &
开发语言·c++·算法
web打印社区2 小时前
政务办事大厅:叫号小票、办理回执网页怎么静默出纸
前端·javascript·vue.js·pdf·html·政务
Joe_Wang52 小时前
【从0到1学习JVM · 21】既不浪费空间又没有碎片,标记整理算法到底慢在哪
jvm·学习·算法·垃圾回收·标记整理算法
让学习成为一种生活方式2 小时前
PlantCellChat--单细胞与空间转录组数据预测植物细胞间通讯的R包--The Plant Journal
算法
C++ 老炮儿的技术栈2 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
梦帮科技2 小时前
多任务权重流形融合:SLERP 球形线性插值、DARE 稀疏剪枝与多专家模型融合落地
人工智能·深度学习·算法·机器学习·tensorflow·聚类·剪枝
Tisfy2 小时前
LeetCode 0020.有效的括号:栈匹配
算法·leetcode·字符串·题解·括号匹配