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

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

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486663 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法