2014-07-10 15 views
0

給定的是包含N個數字的數組,A[0], A[1], ... A[N-1]。計算的長度N的陣列B,使得線性時間的棘手的部分產品

B[i] = A[0]*A[1]*...A[i-1]*A[i+1]...*A[N-1]. 

算法應該在時間工作O(N),存儲器O(1)而不能使用劃分。

我試着通過計算前幾個項,然後以某種方式組合它們以獲得後續產品的時間。但我無法將它們結合起來。任何幫助,將不勝感激。

+1

的輸出是O(n),所以當你說內存是O(1)時,你的意思是輸出'B'必須替換A,還是你的意思是我們不能使用A和B以外的任何內存? – CaptainCodeman

+0

@CaptainCodeman是的。您可以使用的額外空間是O(1) – user2179293

+1

那麼,它是什麼,輸出數組B是從A分離還是應該取代A? – Joni

回答

5

兩次遍歷數組。首先從左到右,隨時計算部分產品並將它們存儲到B中。在C狀僞代碼:

prod = 1; 
for (n=0; n<N, n++) { 
    B[n] = prod; 
    prod *= A[n]; 
} 

接着,扭轉,經歷的陣列從右到左,計算部分積並將其與值B已經乘以:

prod = 1; 
for (n=N-1; n>=0; n--) { 
    B[n] *= prod; 
    prod *= A[n]; 
} 
+0

正確。好的答案。 – Sayakiss

+0

這是使用O(n)額外的內存,在B被視爲單獨的內存的情況下。 – CaptainCodeman

+0

@CaptainCodeman當我讀到這個問題時,這就是要求的。我不確定它甚至可以通過修改A來完成。 –