安全プランに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つのサイクルのための学習の価値があるが、また、完全に透明反射に分け想像することは難しいことではありません。