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

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

题目描述

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

题目数据 保证 数组 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 <= nums[i] <= 30

输入 保证 数组 answer[i] 在 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
};

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

相关推荐
Jay Kay11 分钟前
GVPO:Group Variance Policy Optimization
人工智能·算法·机器学习
Epiphany.55623 分钟前
蓝桥杯备赛题目-----爆破
算法·职场和发展·蓝桥杯
YuTaoShao1 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法三)DP 空间优化
算法·leetcode·职场和发展
茉莉玫瑰花茶1 小时前
C++ 17 详细特性解析(5)
开发语言·c++·算法
cpp_25011 小时前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_25011 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
uesowys1 小时前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法
TracyCoder1232 小时前
LeetCode Hot100(26/100)——24. 两两交换链表中的节点
leetcode·链表
季明洵2 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi2 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公