LeetCode 热题 100——普通数组——除自身以外数组的乘积

18.除自身以外数组的乘积

题目描述

给你一个整数数组 nums,返回 数组 answer ,其中 answeri 等于 nums 中除 numsi 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = 1,2,3,4

输出: 24,12,8,6

示例 2:

输入: nums = -1,1,0,-3,3

输出: 0,0,9,0,0

提示:

2 <= nums.length <= 105

-30 <= numsi <= 30

输入 保证 数组 answeri 在 32 位 整数范围内

进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)

求解

这道题第一个思路 就是使用 除法,算一个全部乘积,然后遍历数组,除以i位置的元素,但是存在为0的情况,使用除法就会出问题。

(1)前缀乘积+后缀乘积

使用 两个数组分别计算得到 前缀乘积和后缀乘积 数组,遍历的时候,除去i 位置的前缀和后缀乘积相乘即可。

js 复制代码
var productExceptSelf = function(nums) {
    let len = nums.length
    // 定义两个数组,分别存放 前缀乘积、后缀乘积 (类似 前缀和)
    let preArr = new Array(len)
    let sufArr = new Array(len)
    let preMul = 1
    for (let i = 0; i < len; i++) {
        preMul *= nums[i]
        preArr[i] = preMul
    }
    let sufMul = 1
    for (let i = len - 1; i >= 0; i--) {
        sufMul *= nums[i]
        sufArr[i] = sufMul
    }
    for (let i = 0; i < len; i++) {
        if (i === 0) {
            nums[i] = sufArr[i + 1]
        } else if (i === len - 1) {
            nums[i] = preArr[i - 1]
        } else {
            nums[i] = preArr[i - 1] * sufArr[i + 1]
        }
    }
    return nums
};

(2)优化

主要是优化 空间复杂度

js 复制代码
var productExceptSelf = function(nums) {
    // 优化空间复杂度
    let len = nums.length
    // 定义两个数组,分别存放 前缀乘积、后缀乘积 (类似 前缀和)
    let ans = new Array(len)

    // ans[i] 表示 索引i左侧所有元素的乘积
    // 索引为 0 的元素左侧没有元素,ans[0] = 1
    ans[0] = 1
    for (let i = 1; i < len; i++) {
        ans[i] = ans[i - 1] * nums[i - 1]
    }

    // 定义R:为右侧所有元素的乘积
    let R = 1
    for (let i = len - 2; i >= 0; i--) {
        R *= nums[i + 1]
        ans[i] = ans[i] * R
    }
    return ans
};

这样就不用计算两个数组,时间复杂度不变,并且省出了一半的空间。

相关推荐
江畔柳前堤7 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Doraemomo7 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore8 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考10 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX11 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面11 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号11 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽12 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI12 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
MC皮蛋侠客13 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis