題目:給定一個數組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[i]=A[0]*A[1]*.....*A[n-1]/A[i]表示,使用除法時要特別注意A[i]等於0的狀況。
如今要求不能使用除法,只能用其餘方法。一個直觀的解法是用連乘n-1個數字獲得B[i].顯然這個方法須要O(n*n)的時間構造整個數組B.
好在還有更高效的算法。能夠把B[i]=A[0]*A[1]*.....*A[i-1]*A[i+1]*.....*A[n-1].當作A[0]*A[1]*.....*A[i-1]和
A[i+1]*.....A[n-2]*A[n-1]兩部分的乘積。所以,數組B能夠用一個矩陣來建立。在圖中,B[i]爲矩陣中第i行全部元素的乘積.
不妨定義C[i]=A[0]*A[1]*....*A[i-1],D[i]=A[i+1]*...*A[n-2]*A[n-1].
C[i]能夠用自上而下的順序計算出來,即C[i]=C[i-1]*A[i-1].相似的
D[i]=D[i+1]*A[i+1]
下面是這種思路C++實現,數組用標準模板庫中的vector表示:
1 void multiply(const vevctor<double>& array1,vector<double>& array2)
2 {
3 int length1=array1.size();
4 int length2=array2.size();
5 if(length1==length2&&length2>1)
6 {
7 array2[0]=1;
8 for(int i=1;i<length1;++i)
9 {
10 array2[i]=array2[i-1]*array1[i-1];
11 }
12 double temp=1;
13 for(i=length1-2;i>=0;--i)
14 {
15 temp *=array1[i+1];
16 array2[i] *=temp;
17 }
18 }
19 }
20