746. 使用最小花费爬楼梯
746. 使用最小花费爬楼梯
一、题目描述
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值cost[i](下标从 0 开始)。
每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
1 | 输入:cost = [10, 15, 20] |
1 | 输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] |
二、解题思路
假设此时要计算走到第i个阶梯的花费,那么有2种情况可以做到:
- 此时站在
i - 1
阶梯上,迈1步走上第i个阶梯,需要花费cost[i - 1]
; - 此时站在
i - 2
阶梯上,迈2步走上第i个阶梯,需要花费cost[i - 2]
。
因此走到第i个阶梯的最小花费就是:
1 | minCost[i] = min(minCost[i - 1] + cost[i - 1], minCost[i - 2] + cost[i - 2]); |
题目的要求是走过n个阶梯,并不是走到第n个阶梯。
也就是说,实际上应该是要走到第 n + 1 个阶梯上面,所以最终求的结果应该是 minCost[n + 1]
。
三、复杂度分析
- 时间 O(n)
- 空间 O(1)
四、参考代码
1 | /** |
优化空间,因为只用到了 minCost[i - 1]
和 minCost[i - 2]
,所以直接用2个变量保存就行。
1 | /** |