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

文章目录

题目描述

给定一个数组 A [ 0 , 1 , . . . , n 1 ] A[0,1,...,n-1] ,请构建一个数组 B [ 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 ] B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] 。不能使用除法。

分析

  • 方法一:暴力解法双层循环,时间复杂度O( n 2 n^2 );空间复杂度O(1)。
  • 方法二:构建前向乘积数组 C [ i ] = A [ 0 ] A [ 1 ] . . . A [ i 1 ] C[i]=A[0]*A[1]*...*A[i-1] ,即 C [ i ] = C [ i 1 ] A [ i 1 ] C[i]=C[i-1]*A[i-1] ;构建后向乘积数组 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 ] = D [ i + 1 ] A [ i + 1 ] D[i]=D[i+1]*A[i+1] ;通过 C [ i ] , D [ i ] C[i],D[i] 来求 B [ i ] B[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
发布了219 篇原创文章 · 获赞 85 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/z_feng12489/article/details/103614745