給定的是包含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)
而不能使用劃分。
我試着通過計算前幾個項,然後以某種方式組合它們以獲得後續產品的時間。但我無法將它們結合起來。任何幫助,將不勝感激。
給定的是包含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)
而不能使用劃分。
我試着通過計算前幾個項,然後以某種方式組合它們以獲得後續產品的時間。但我無法將它們結合起來。任何幫助,將不勝感激。
兩次遍歷數組。首先從左到右,隨時計算部分產品並將它們存儲到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];
}
正確。好的答案。 – Sayakiss
這是使用O(n)額外的內存,在B被視爲單獨的內存的情況下。 – CaptainCodeman
@CaptainCodeman當我讀到這個問題時,這就是要求的。我不確定它甚至可以通過修改A來完成。 –
的輸出是O(n),所以當你說內存是O(1)時,你的意思是輸出'B'必須替換A,還是你的意思是我們不能使用A和B以外的任何內存? – CaptainCodeman
@CaptainCodeman是的。您可以使用的額外空間是O(1) – user2179293
那麼,它是什麼,輸出數組B是從A分離還是應該取代A? – Joni