数组--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、抽象与扩展

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

相关推荐
专注仿真3 小时前
ACM算法
算法·深度优先
顺顺 尼6 小时前
linux 进程信号(上)
linux·c++·算法
罗西的思考6 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(5)--- GRPO
人工智能·算法·机器学习
richard_yuu6 小时前
动态规划:强化学习的「数学基础」,从 MDP 到值迭代
深度学习·神经网络·算法·yolo·机器学习·动态规划
mmmmath_36 小时前
LeetCode.225.用队列实现栈
算法
Elaine3366 小时前
数据结构与算法-程序
数据结构·python·算法·计算机基础·编程基础
2601_965742226 小时前
布局GEO AI本地营销,我重点看这几个细节
大数据·人工智能·算法·ai·新媒体运营
EatFan6 小时前
AI Agent 上生产前先加三道闸门:审批、限权、可回放的工程实践
人工智能·python·算法·多智能体·ai agent·mcp·harness
思茂信息7 小时前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
Persistent的粽子!7 小时前
双指针算法:最大盛水容器
c++·算法·leetcode