動態規劃 - JavaScript陣列元素部分和
在這個問題陳述中,我們的任務是計算陣列所有元素的總和,並在每一步去除一個元素,並顯示所有可能的子陣列總和的結果陣列。並使用Javascript功能實現此問題。
給定問題的邏輯
給定問題指出,我們必須計算每一步除一個元素之外的每個元素的總和。為了解決給定的問題,我們將定義一個數組作為輸入,並返回一個數組作為輸出,該陣列透過在每次迭代中減去一個元素來計算元素的總和。
我們將使用for迴圈迭代陣列的專案,並使用與之前相同的方法,透過消除當前元素來計算總和。然後將這些總和新增到新的結果陣列中。在每個階段,當前元素都會被更改。
演算法
步驟1 − 在程式開始時,宣告一個整數陣列,該陣列將用於計算每一步除一個元素之外的所有元素的總和。在我們的程式碼中,如果陣列中有5個元素,那麼我們將計算四個元素的總和。
步驟2 − 如果n是陣列中存在的專案數,我們必須將n-1個專案的和儲存在陣列中。因此,為了儲存總和,我們將建立一個總和陣列。
步驟3 − 在Javascript中,我們有一種稱為reduce的方法,用於透過逐一迭代元素來更新陣列的所有值。因此,我們還將使用reduce方法來獲取所有元素的總和。
步驟4 − 獲取總和後,將其推入結果變數。
步驟5 − 現在啟動for迴圈,並執行到陣列的長度。
步驟6 − 在此階段,我們將從陣列中切片一個元素以獲取n-1個專案的總和。
步驟7 − 在最後一步,將所有結果總和推入結果陣列,並在控制檯中獲取輸出。
演算法程式碼
// array to calculate the part sum const arr = [1, 2, 3, 4, 5]; // resultant array const sumArray = (arr = []) => arr.reduce((a, b) => a + b, 0); const sumWithoutOne = (arr = []) => { const result = [sumArray(arr)]; for (let i = 0; i < arr.length; i++) { const sum = sumArray(arr.slice(0, i).concat(arr.slice(i + 1))); result.push(sum); } return result; }; console.log(sumWithoutOne(arr));
複雜度
我們可以在程式碼中看到,我們使用reduce方法,它需要O(n)時間來執行。另一個函式sumWithoutOne使用for迴圈和slice方法,它也需要O(n)時間,但slice方法被呼叫n次,因為它在for迴圈中,所以總時間複雜度將為O(n^2)。空間複雜度為O(n),其中n是新陣列中總和的個數。
結論性說明
我們在上面的演算法中看到了如何獲取陣列一部分的總和。如果一個數組有n個元素,我們透過每一步從陣列中刪除一個元素並建立一個新的陣列來計算n-1個元素的總和,該陣列包含n-1個專案的總和。因此,這段程式碼的時間複雜度為O(n^2),空間複雜度為O(n)。