製品配列の構築を実現する
タイトル説明
配列A [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 [0] = A [1] * A [2] *…* A [n-1]、B [n-1] = A [0] * A [1] *…* A [n -2];)
Aの長さが1の場合、Bは無意味で構築できないため、このような状況は発生しません。
ソリューションのアイデア
乗算を使用して問題を分析することはできないため、積を2つの項に分割できます。これは:
C [i] = A [0] * A [1] *…* A [i-1]
D [i] = A [i +1] … A [n-1]
B [i] = C [i] * D [i]
数学的帰納法を使用して、最初にC [i]を計算しましょう。
C [0] = 1
C [1] = A [0]
C [2] = A [0] * A [1]
C [3] = A [0] * A [1] * A [2]
…
私たちルールは次のように描くことができます。C[i] = C [i-1] * A [i -1](i> = 1)
D [i]の計算には、引き続き数学的帰納法を使用します。
D [n-1] = 1
D [n-2] = A [n -1]
D [n-3] = A [n-1] * A [n-2]次
の法則を描くことができます:D [i ] = D [i + 1] * A [i + 1](i <= n-2)
この質問は、Java言語で次のように書かれています。
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
if (A == null || A.length <= 0) {
return null;
}
int[] C = new int[A.length];
C[0] = 1;
for (int i = 1; i < C.length; i++) {
C[i] = C[i - 1] * A[i - 1];
}
int[] D = new int[A.length];
D[D.length - 1] = 1;
for (int i = D.length - 2; i >= 0; i--) {
D[i] = D[i + 1] * A[i + 1];
}
int[] result = new int[A.length];
for (int i = 0; i < result.length; i++) {
result[i] = C[i] * D[i];
}
return result;
}
}