給定數組 a[N],構造數組 b[N],使得 b[i] = a[0]*a[1]*...*a[N-1] / a[i]。
限制條件:
1. **不准使用除法**
2. 除循環變量、a、b 外,**不准使用任何額外變量**(含局部/全局)
3. 時間 O(N),空間 O(1)
b[i] 等價於 (a[0]...a[i-1]) * (a[i+1]...a[N-1])。定義:
- left[i] = a[0]*...*a[i-1](i 左側乘積)
- right[i] = a[i+1]*...*a[N-1](i 右側乘積)
則 b[i] = left[i] * right[i]。
可用 b 數組本身暫存中間結果,兩次掃描完成:
#include <stdio.h>
#include <stdlib.h>
void Multiplication(int *a, int *b, int length) {
int i;
b[0] = 1;
for (i = 1; i < length; i++) {
b[0] *= a[i - 1];
b[i] = b[0];
}
b[0] = 1;
for (i = length - 2; i > 0; i--) {
b[0] *= a[i + 1];
b[i] *= b[0];
}
b[0] = a[1] * b[0];
}
int main() {
int i;
int a[] = {2, 2, 3, 4, 5};
int b[5];
int length = sizeof(a) / sizeof(int);
Multiplication(a, b, length);
for (i = 0; i < length; i++) printf("%d\t", b[i]);
return 0;
}
| i | a[i] | 正向後 b[i]=left | 反向後 b[i] |
|---|---|---|---|
| 0 | 2 | 1 | 2*3*4*5=120 |
| 1 | 2 | 2 | 2*3*4*5=120 |
| 2 | 3 | 4 | 2*2*4*5=80 |
| 3 | 4 | 12 | 2*2*3*5=60 |
| 4 | 5 | 48 | 2*2*3*4=48 |