[LeetCode 746. Min Cost Climbing Stairs(Easy)] JavaScript Dynamic Programming Solution
題目:
You are given an integer array cost
where cost[i]
is the cost of ith
step on a staircase. Once you pay the cost, you can either climb one or two steps.
You can either start from the step with index 0
, or the step with index 1
.
Return the minimum cost to reach the top of the floor.
理解:
計算出走到頂點的最少花費,可以選擇一次走一步或兩步,也可以選擇從第一階或最底部開始走。
想法:
也是聯想到 graph 的概念,從頂部開始往下找出到達某個點的最小值,因此直覺用 recursion 來解。
First Submission (Implemented by myself)
時間:半小時
虛擬碼:
declare minPath function with length as input
base case: length <= 1, return 0
declare path 1 = calculate the cost of climbing one step, call minPath with length - 1 as input
declare path 2 = calculate the cost of climbing two step, call minPath with length - 2 as input
find the minimun path and return it
實作:
結果:
Time Limit Exceeded
Time complexity: O(2^n)
Space complexity: O(n)
Second Submission (Dynamic Programming)
前一個解法重複計算很多次一樣的 minPath(n),所以改用物件把計算過的值存在來,下次再遇到時值出從物件中取得就好,減少再次計算的時間。
實作:
結果:
Success
Time complexity: O(n), minPath gets called from 0 to n.
Space complexity: O(n) to keep the recursion stack and object.
Third Submission (Refer to Solution, Bottom-Up)
前一個解法是使用 recursion 從頂部往下算,參考解答後發現另外可用從底部往上算的解法。另外,前一個解法用物件存計算過的值,其實也可以用陣列來存,取用速度較物件快。
實作:
結果:
Success
Time complexity: O(n), because we iterate n-1 times, and each iteration takes O(1) time.
Space complexity: O(n) to keep the array.
Fourth Submission (Refer to Solution, Bottom-Up, Constant Space)
使用從底部開始的 iteration 解法,因為我們只需要一個到達頂部的最小值,不需要把過程都記在陣列裡,所以還有另一種更節省空間的寫法。
實作:
結果:
Success
Time complexity: O(n), because we iterate n-1 times, and each iteration takes O(1) time.
Space complexity: O(1) to keep two variables.