数组--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 分钟前
代码随想录 115.不同的子序列
算法
c#上位机7 分钟前
halcon2个区域合并为1个区域—union2
图像处理·算法·计算机视觉·halcon
程序员-King.15 分钟前
双指针/滑动窗口—算法总结与教学指南
经验分享·算法·双指针
小武~29 分钟前
Leetcode 每日一题C 语言版 -- 274 H-index
c语言·算法·leetcode
0 0 033 分钟前
CCF-CSP 36-3 缓存模拟(cache)【C++】
开发语言·c++·算法
蒟蒻小袁33 分钟前
Hot100--找到字符串中所有字母异位词
java·算法·leetcode·面试
kingmax5421200839 分钟前
高中数学教师资格面试试讲稿:《直线的位置关系(例2)》
线性代数·算法·面试·矩阵·教师资格
吃着火锅x唱着歌40 分钟前
LeetCode 2909.元素和最小的山形三元组II
数据结构·算法·leetcode
小O的算法实验室1 小时前
2026年SEVC SCI2区,基于k均值聚类和自适应双群策略的粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
程序员-King.1 小时前
day115—同向双指针—将x减到0的最小操作数(LeetCode-1658)
算法·leetcode·双指针