来源:代码随想录 本题的力扣链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs/
1、题目描述:
2、思路:
我们依然按照代码随想录中的五部曲来:
3、代码:
3.1 python代码:
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
n = len(cost)
dp = [0 for i in range(n)]
dp[0], dp[1] = cost[0], cost[1]
for i in range(2, n):
dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
return min(dp[n-1], dp[n-2])
3.2 C++代码:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(n);
dp[0] = cost[0];
dp[1] = cost[1];
for (int i = 2; i < n; i++){
dp[i] = min(dp[i-1], dp[i-2]) + cost[i];
}
return min(dp[n-1], dp[n-2]);
}
};
3.3 复杂度:
- 时间复杂度:
O
(
n
)
O(n)
O(n)
- 空间复杂度:
O
(
n
)
O(n)
O(n)
由于所有的状态都可以由前两个确定,所以不需要维护一个数组,而只是维护两个变量即可,所以可以降低空间复杂度到
O
(
1
)
O(1)
O(1)。
4、总结:
确定一道题用动态规算法做时,按如下做法:
- 1、确定dp数组及下标的含义;
- 2、确定递推公式;
- 3、dp数组如何初始化;
- 4、确定遍历顺序;
- 5、举例推导dp数组。
最后,说明一下:上面的动态规划实际上 不需要把整个dp都算出来,只需要维护两个数即可。
|