数组--238.除自身以外数组的乘积/medium

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

1、题目

给你一个整数数组 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
  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

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

  • 数组
  • 前缀和

2、题目分析

1、求某数据之外,其余所有数据的相互处理,则可提前按处理规则,处理出前缀数组、后缀数组。

2、然后在求某数据外所有数据的相互处理时,可O(1)时间复杂度,用其前缀数组+后缀数组处理出结果。

3、解题步骤

1、处理出前缀数组、后缀数组。

2、这样在求某数据外所有数据的相互处理时,可O(1)时间复杂度,用其前缀数组+后缀数组处理出结果。

4、复杂度最优解代码示例

java 复制代码
    public int[] productExceptSelf(int[] nums) {
        int[] res = new int[nums.length];
        // k为该数左边的乘积。
        int k = 1;
        for (int i = 0; i < res.length; i++) {
            res[i] = k;
            // 此时数组存储的是除去当前元素左边的元素乘积
            k *= nums[i];
        }
        // k为该数右边的乘积。
        k = 1;
        for (int i = res.length - 1; i >= 0; i--) {
            res[i] *= k;
            // 此时数组等于左边的 * 该数右边的。
            k *= nums[i];
        }
        return res;
    }

5、抽象与扩展

求某数据之外,其余所有数据的相互处理,则可提前按处理规则,处理出前缀数组、后缀数组。

相关推荐
lifallen1 天前
从Apache Doris 学习 HyperLogLog
java·大数据·数据仓库·算法·apache
智驱力人工智能1 天前
使用手机检测的智能视觉分析技术与应用 加油站使用手机 玩手机检测
深度学习·算法·目标检测·智能手机·视觉检测·边缘计算
姚瑞南1 天前
【AI 风向标】四种深度学习算法(CNN、RNN、GAN、RL)的通俗解释
人工智能·深度学习·算法
补三补四1 天前
SMOTE 算法详解:解决不平衡数据问题的有效工具
人工智能·算法
RTC老炮1 天前
webrtc弱网-RobustThroughputEstimator源码分析与算法原理
网络·算法·webrtc
听风吹等浪起1 天前
分类算法-逻辑回归
人工智能·算法·机器学习
敲代码的嘎仔1 天前
JavaWeb零基础学习Day2——JS & Vue
java·开发语言·前端·javascript·数据结构·学习·算法
yacolex1 天前
3.3_数据结构和算法复习-栈
数据结构·算法
茉莉玫瑰花茶1 天前
动态规划 - 两个数组的 dp 问题
算法·动态规划
微笑尅乐1 天前
从暴力到滑动窗口全解析——力扣8. 字符串转换整数 (atoi)
算法·leetcode·职场和发展