其他算法-051-构建乘积数组

题目描述

给定一个数组 A [ 0 , 1 , . . . , n − 1 ] A[0,1,...,n-1] A[0,1,...,n1],请构建一个数组 B [ 0 , 1 , . . . , n − 1 ] B[0,1,...,n-1] B[0,1,...,n1],其中B中的元素 B [ i ] = A [ 0 ] ∗ A [ 1 ] ∗ . . . ∗ A [ i − 1 ] ∗ A [ i + 1 ] ∗ . . . ∗ A [ n − 1 ] B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] B[i]=A[0]A[1]...A[i1]A[i+1]...A[n1]。不能使用除法。

分析

  • 方法一:暴力解法双层循环,时间复杂度O( n 2 n^2 n2);空间复杂度O(1)。
  • 方法二:构建前向乘积数组 C [ i ] = A [ 0 ] ∗ A [ 1 ] ∗ . . . ∗ A [ i − 1 ] C[i]=A[0]*A[1]*...*A[i-1] C[i]=A[0]A[1]...A[i1],即 C [ i ] = C [ i − 1 ] ∗ A [ i − 1 ] C[i]=C[i-1]*A[i-1] C[i]=C[i1]A[i1];构建后向乘积数组 D [ i ] = A [ n − 1 ] ∗ A [ n − 2 ] ∗ . . . A [ n − i + 1 ] D[i]=A[n-1]*A[n-2]*...A[n-i+1] D[i]=A[n1]A[n2]...A[ni+1],即 D [ i ] = D [ i + 1 ] ∗ A [ i + 1 ] D[i]=D[i+1]*A[i+1] D[i]=D[i+1]A[i+1];通过 C [ i ] , D [ i ] C[i],D[i] C[i],D[i]来求 B [ i ] B[i] B[i] B [ i ] = C [ i ] ∗ D [ i ] B[i]=C[i]*D[i] B[i]=C[i]D[i]时间复杂度:O(n);空间复杂度O(n)。但是C与D数组的临时存储可全程用B来代替,因此可将空间复杂度降为O(1)。

代码

  • 方法一:
# -*- coding:utf-8 -*-
class Solution:
    def multiply(self, A):
        # write code here
        
        B = []
        length = len(A)
        for i in range(length):
            num = 1
            for j in range(length):
                if i!=j:
                    num *= A[j]
            B.append(num)
                   
        return B
  • 方法二:(优)
# -*- coding:utf-8 -*-
class Solution:
    def multiply(self, A):
        # write code here
        if not A:
            return []
        length = len(A)
        B = [1]*length

        
        for i in range(length-1):
            B[i+1] *= B[i]*A[i]

        temp = 1
        for i in range(length-2, -1, -1):
            temp *= A[i+1]
            B[i] *= temp

        return B
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TransientYear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值