目录
思路
这个问题可以通过动态规划来解决。我们使用一个数组 dp
,其中 dp[i]
表示达到第 i
个台阶所需的最低花费。根据题目要求,可以从下标为 0
或 1
的台阶开始爬
-
初始化
dp[0]
表示从下标为0
的台阶开始的最低花费,即dp[0] = cost[0]
。dp[1]
表示从下标为1
的台阶开始的最低花费,即dp[1] = cost[1]
。
-
递推关系
对于第 i
个台阶(其中 i >= 2
),可以从第 i-1
或第 i-2
个台阶跳上来。因此,
-
结果
最终的答案是dp[n-1]
和dp[n-2]
中的较小值,其中n
是数组cost
的长度。
解题过程
- 初始化
dp
数组,长度为n
,并设置初始值dp[0] = cost[0]
和dp[1] = cost[1]
。 - 使用循环从
2
到n-1
更新dp[i]
的值。 - 返回
dp[n-1]
和dp[n-2]
中的最小值作为结果。
复杂度
- 时间复杂度:O(n),其中
n
是数组cost
的长度。我们只需遍历数组一次进行动态规划计算。 - 空间复杂度:O(n),需要一个额外的数组
dp
存储最低花费的值。
代码实现
class Solution(object):
def minCostClimbingStairs(self, cost):
n = len(cost)
if n == 0:
return 0
if n == 1:
return cost[0]
dp = [0] * n
dp[0] = cost[0]
dp[1] = cost[1]
for i in range(2, n):
dp[i] = min(dp[i-1] + cost[i], dp[i-2] + cost[i])
return min(dp[-1], dp[-2])