製品の配列を構築するための他のアルゴリズム-051-

記事のディレクトリ

タイトル説明

配列を指定して、 A [ 0 1 n個 - 1 ] A [0,1、...、N-1] 、アレイを構築します B [ 0 1 n個 - 1 ] B [0,1、...、N-1] 、前記素子B B [ ] = 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)の空間複雑。
  • 方法2:配列の前に、製品の構築 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