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
};

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

相关推荐
Wect13 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
糖果店的幽灵13 小时前
决策树详解与sklearn实战
算法·决策树·sklearn
Lewiis13 小时前
趣谈排序算法
算法·排序算法
ComputerInBook14 小时前
数字图像处理(4版)——第 8 章——图像压缩与水印(上)(Rafael C.Gonzalez&Richard E. Woods)
人工智能·算法·计算机视觉·图像压缩·图像水印
刀法如飞14 小时前
Python列表去重:从新手三连到高阶特技,20种解法全收录
python·算法·编程语言
minji...14 小时前
算法题 动态规划
算法·动态规划
水蓝烟雨14 小时前
3337. 字符串转换后的长度 II
算法·leetcode
MegaDataFlowers14 小时前
SiliconCompiler workflow
算法
_日拱一卒14 小时前
LeetCode:226翻转二叉树
数据结构·算法·leetcode
踩坑记录15 小时前
leetcode hot100 64. 最小路径和 medium 递归优化
leetcode·深度优先