給定數組 A[1..n],構造 B[1..n] 使得 B[i] = ∏j≠i A[j]。要求 O(n) 時間,不能使用除法。
定義:
則 `B[i] = L[i] * R[i]`。
可優化空間:用 B 數組直接存 L,再用一個變量累積 R 從右向左更新 B。
void productExceptSelf(int* A, int* B, int n) {
// 第一遍:B 存儲左側乘積 L
B[0] = 1;
for (int i = 1; i < n; i++) B[i] = B[i-1] * A[i-1];
// 第二遍:從右向左累積右側乘積 R,直接乘到 B
int R = 1;
for (int i = n-1; i >= 0; i--) {
B[i] *= R;
R *= A[i];
}
}
利用 `log(a*b) = log a + log b`,將乘法轉為加法。但浮點數精度誤差導致結果不準確,不推薦用於精確計算。
A = [1, 2, 3, 4, 5]