You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2 Output: 2 Explanation: There are two ways to climb to the top. 1. 1 step + 1 step 2. 2 steps
Example 2:
Input: 3 Output: 3 Explanation: There are three ways to climb to the top. 1. 1 step + 1 step + 1 step 2. 1 step + 2 steps 3. 2 steps + 1 step<Solution>
想法如下
- 用 recursive 會 TLE,必須優化,所以考慮 DP 來優化
- 用 dp[i] 來表示在 i 所要花費的最少 cost,公式是 dp[i] = cost[i] + min(dp[i-1], dp[i-2])
Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public int minCostClimbingStairs(int[] cost) { | |
int oneStepBefore = cost[1], twoStepBefore = cost[0]; | |
int curStepCost; | |
for(int i = 2; i < cost.length; i++) { | |
curStepCost = cost[i] + Math.min(oneStepBefore, twoStepBefore); | |
twoStepBefore = oneStepBefore; | |
oneStepBefore = curStepCost; | |
} | |
return Math.min(oneStepBefore, twoStepBefore); | |
} | |
} |
kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
fun minCostClimbingStairs(cost: IntArray): Int { | |
var oneStepBeforeCost = cost[1] | |
var twoStepBeforeCose = cost[0] | |
var currentCost = 0 | |
for(i in 2 until cost.size) { | |
currentCost = cost[i]+ Math.min(oneStepBeforeCost, twoStepBeforeCose) | |
twoStepBeforeCose = oneStepBeforeCost | |
oneStepBeforeCost = currentCost | |
} | |
return Math.min(oneStepBeforeCost, twoStepBeforeCose) | |
} | |
} |
沒有留言:
張貼留言