剑指offer 74. 构建乘积数组

简介: 剑指offer 74. 构建乘积数组

题目描述

给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i]=A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]

不能使用除法。

数据范围

输入数组长度 [0,20]。


样例

输入:[1, 2, 3, 4, 5]
输出:[120, 60, 40, 30, 24]


思考题

  • 能不能只使用常数空间?(除了输出的数组之外)



方法一:空间复杂度为常数的算法 O(n)


由于题目限制不能使用除法,而且如果计算每个数都从前遍历一遍数组,时间复杂度就比较高。这里最优的做法就是动态的去更新数组信息,先计算每个数左边的乘积,再计算右边数的乘积。这样讲可能不那么直观,我们来看一个例子,假设给定数组 [1, 2, 3, 4, 5] 。


我们用一个容器 res 来存储答案,并且初始化 res[0] = 1 。


11f58208599a4d968928e42cca30e6d2.png

然后开始从左向右遍历数组,计算每个数左边数的乘积,并更新到 res 数组中。


590e1f4198a94e1c9a17524a8ad03a03.png


4cac07a2115c4b72ad715ffbb0dba2b1.png


d28e37e56b734ea89212e1a3b674fee9.png

c734b61ea96c46f1990081a3c74ef37b.png

最后再从右向左遍历数组,计算每个数右边的数的乘积,并将 res[i] 乘上右边数的乘积,就得到了除 A[i] 以外其它数的乘积。


e9ae5be2279d40f9b39f33dd2fb299eb.png

85af63565090404ea8fb2f9ac391ed95.png


f96c5e78143346da9b777a6b789206d7.png



1bc39eb289ac428a831bdf398c33a444.png


class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        if (A.empty())   return A;
        int n = A.size();
        vector<int> res(n);
        res[0] = 1;
        //先计算每个数左边的乘积
        for (int i = 1, p = A[0]; i < A.size(); i++)
        {
            res[i] = p;
            p *= A[i];
        }
        //再计算每个数右边的乘积
        for (int i = n - 2, p = A[n - 1]; i >= 0; i--)
        {
            res[i] *= p;
            p *= A[i];
        }
        return res;
    }
};

欢迎大家在评论区交流~

目录
相关文章
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
57 0
|
5月前
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
|
6月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
6月前
|
存储 算法
算法题解-除自身以外数组的乘积
算法题解-除自身以外数组的乘积
|
6月前
|
存储 测试技术 索引
每日一题——除自身以外数组的乘积
每日一题——除自身以外数组的乘积
|
6月前
|
存储 人工智能 Java
每日一题《剑指offer》数组篇之构建乘积数组
每日一题《剑指offer》数组篇之构建乘积数组
46 0
每日一题《剑指offer》数组篇之构建乘积数组
|
6月前
|
存储 BI
【剑指offer】-构建乘积数组-42/67
【剑指offer】-构建乘积数组-42/67
|
6月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
52 0
|
算法 索引
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
22 0
|
人工智能 算法 BI
剑指offer(C++)-JZ66:构建乘积数组(算法-其他)
剑指offer(C++)-JZ66:构建乘积数组(算法-其他)