其他算法-051-構建乘積數組

題目描述

給定一個數組A[0,1,...,n1]A[0,1,...,n-1],請構建一個數組B[0,1,...,n1]B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i1]A[i+1]...A[n1]B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

分析

  • 方法一:暴力解法雙層循環,時間複雜度O(n2n^2);空間複雜度O(1)。
  • 方法二:構建前向乘積數組C[i]=A[0]A[1]...A[i1]C[i]=A[0]*A[1]*...*A[i-1],即C[i]=C[i1]A[i1]C[i]=C[i-1]*A[i-1];構建後向乘積數組D[i]=A[n1]A[n2]...A[ni+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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章