安全プランを証明する66の構築物配列(自己除きアレイのLeetcode 238製品)

安全プランに66アレイを証明するために建設製品

トピック:

アレイA所与[0、1、...、N-1]、[0、1、...、N-1] Bは、素子Bの[I] = A [配列B構築してください0] * A [1] * ... * A [I-1] * A [I +1] ... [N-1]。あなたは分裂を使用することはできません。

同leetcode 238

https://leetcode.com/problems/product-of-array-except-self/

分析:

分割を利用することができる場合、の使用([0] * A [1] * ... [N-1])/ A [i]は、[i]が0に等しいことに留意しなければなりません!

暴力溶液B、十分な効率的なアレイを構築するためにはO(n ^ 2)を必要とします。

この問題を解決するためのO(n)との時間の複雑さ:

比較の独創的なアイデアは、我々は知っているB [I] = A [0] * A [1] * ... * A [I-1] * A [I + 1] ... [N-1]、私たちB [i]は二つの部分に工程で得られました:

第一部:[0] * A [1] * ... * A [I-1];第二部:[I + 1] * ... * A [N-1]

ましょう「ボトムアップ」第1の演算部と、記憶B;および第2の部分を計算する「トップダウン」、そして第一の結合部分B、「トップダウン」更新B素子。

この問題を解決するために、ループため2。

ボイド乗算(CONSTベクター< ダブル >&ARRAY1、ベクトル< ダブル >&配列2){
     int型長さ1 = array1.size()。
    INT LENGTH2 = array2.size()。
    もし(長さ1 == LENGTH2 && LENGTH2> 1 ){ 
        配列2 [ 0 ] = 1 ;
        // 计算并存储第一部分が
        ためint型 I = 1 ; I <長さ1; ++ I){ 
            配列2 [I] =配列2 [I - 1 ] *配列1 [I - 1 ]。
        } 
        //ARRAY2第2の部分を計算し、更新
        ダブル = TEMP 1。;
         のためにINT I =長さ1 - 2 ; I> = 0 ;株式会社(www.i-levelmedia.com)){ // この時間配列2の[LENGTH2 -1]が正しい値である 
            TEMP * =配列1 [ + I 1。]; 
            配列2 [I] * = TEMP; 
        } 
    } 
}

要約:

O(N)のこの溶液時間複雑。

この独創的な問題を解決するためのアイデアが、また来観測の問題。多分二つの部分、全体的なアイデアの、特に後に、再びそれを行ったが、書き込みの2つのサイクルのための学習の価値があるが、また、完全に透明反射に分け想像することは難しいことではありません。

おすすめ

転載: www.cnblogs.com/Flash-ylf/p/11497899.html