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

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

相关推荐
罗西的思考2 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机2 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
Nil2083 小时前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返4 小时前
算法系列2:滑动窗口
算法
Herbert_hwt4 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
Tisfy6 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-6 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。6 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论
专注仿真7 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
zlinear数据采集卡7 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源