《剑指 Offer (第 2 版)》第 66 题:构建乘积数组

第 66 题:构建乘积数组

传送门:构建乘积数组,牛客网 online judge 地址。

给定一个数组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]

不能使用除法。

样例:

输入:[1, 2, 3, 4, 5]

输出:[120, 60, 40, 30, 24]

思考题

  • 能不能只使用常数空间?(除了输出的数组之外)
《剑指 Offer (第 2 版)》第 66 题:构建乘积数组-1

思路:使用矩阵法求解,将矩阵分为上三角矩阵和下三角矩阵,分别求乘积。

《剑指 Offer (第 2 版)》第 66 题:构建乘积数组-2

Python 代码:

class Solution(object):
    def multiply(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """

        l = len(A)
        if l == 0:
            return []
        b = [None for _ in range(l)]

        b[0] = 1
        # 计算下三角连乘的结果
        for i in range(1, l):
            b[i] = b[i - 1] * A[i - 1]

        temp = 1
        for i in range(l - 2, -1, -1):
            temp *= A[i + 1]
            b[i] *= temp
        return b

Python 代码:

# 66、构建乘积数组

class Solution(object):
    def multiply(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """

        l = len(A)
        if l == 0:
            return []
        b = [1 for _ in range(l)]
        temp = 1
        for index in range(l):
            b[index] *= temp
            temp *= A[index]
        temp = 1
        for index in range(l - 1, -1, -1):
            b[index] *= temp
            temp *= A[index]
        return b

Java 代码:

《剑指 Offer (第 2 版)》第 66 题:构建乘积数组-3

C++ 代码:

class Solution {
public:
    vector multiply(const vector& A) {
        vectorleft(A.size(),1);
        vectorright(A.size(),1);
        for(int i = 1;i=0;i--){
            right[i] = A[i+1]*right[i+1];
        }
        vectorB(A.size(),0);
        for(int i = 0;i

作者:cornerCao
链接:https://www.acwing.com/solution/AcWing/content/759/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(《剑指 Offer (第 2 版)》第 66 题:构建乘积数组)