题目:
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.
Example 1:
Input: cost = [10,15,20] Output: 15 Explanation: You will start at index 1. - Pay 15 and climb two steps to reach the top. The total cost is 15.
Example 2:
Input: cost = [1,100,1,1,1,100,1,1,100,1] Output: 6 Explanation: You will start at index 0. - Pay 1 and climb two steps to reach index 2. - Pay 1 and climb two steps to reach index 4. - Pay 1 and climb two steps to reach index 6. - Pay 1 and climb one step to reach index 7. - Pay 1 and climb two steps to reach index 9. - Pay 1 and climb one step to reach the top. The total cost is 6.
Constraints:
2 <= cost.length <= 1000
0 <= cost[i] <= 999
思路:
最近开始看dp,从简单的刷起。这题要点在于最后一步的cost我们其实是不用在意的。dp[i]表示走带第i层需要的最小花费。从i = 2开始,每一步都取决于前面i - 1和i - 2所花费的的最小值,因为第n层花费不用管,而n只从n - 1和n - 2获得,dp数组计算到n - 1即可,这里n为cost.size()。最后我们从dp[n - 1]和dp[n - 2]中取最小值。代码2只是代码1的简化,用两个int代替整个数组,空间优化。
代码1:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size(),0);
dp[0]=cost[0];
dp[1]=cost[1];
for(int i =2;i<cost.size();i++)
dp[i]=min(dp[i-1],dp[i-2])+cost[i];
return min(dp[cost.size() - 2], dp[cost.size() - 1]);
}
};
代码2:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
int dp0 = cost[0], dp1 = cost[1];
for (int i = 2; i < n; i++) {
int dp2 = min(dp0, dp1) + cost[i];
dp0 = dp1;
dp1 = dp2;
}
return min(dp0, dp1);
}
};