已解答
简单
给你一个整数数组 cost
,其中 cost[i]
是从楼梯第 i
个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0
或下标为 1
的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20] 输出:15 解释:你将从下标为 1 的台阶开始。 - 支付 15 ,向上爬两个台阶,到达楼梯顶部。 总花费为 15 。
示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1] 输出:6 解释:你将从下标为 0 的台阶开始。 - 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。 - 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。 - 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。 - 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。 - 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。 - 支付 1 ,向上爬一个台阶,到达楼梯顶部。 总花费为 6 。
提示:
2 <= cost.length <= 1000
0 <= cost[i] <= 999
知识点扩充:
1.dfs()函数:
DFS是一种用于图形和树的搜索算法,它通过尽可能深地搜索图形的分支来遍历或查找目标节点。下面是一个示例代码来说明如何实现DFS算法:
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start)
for next_node in graph[start] - visited:
dfs(graph, next_node, visited)
graph = {
'A': {'B', 'C'},
'B': {'A', 'D'},
'C': {'A', 'E'},
'D': {'B'},
'E': {'C'}
}
dfs(graph, 'A')
- 函数
dfs
接受三个参数:graph
表示图形的邻接表,start
表示开始节点,visited
表示已访问的节点集合。如果visited
为空,则将其初始化为空集合。 visited.add(start)
将开始节点添加到已访问集合中。print(start)
打印当前访问的节点。for next_node in graph[start] - visited:
遍历与当前节点相邻且尚未访问过的节点。dfs(graph, next_node, visited)
递归调用dfs
函数,以当前节点作为新的起始节点。
2.@cache
@cache
是一个装饰器函数,可以用于缓存函数的结果以提高性能。当一个函数被@cache
装饰后,它的结果将被缓存起来,下次调用该函数时可以直接返回缓存的结果,而不必重新执行函数体。
下面是一个使用@cache
装饰器的示例:
from functools import cache
@cache
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(5))
# 输出: 5
我们定义了一个fibonacci
函数,用于计算斐波那契数列的第n
个数。由于斐波那契数列的计算具有重复性,使用缓存可以避免重复计算,提高性能。
@cache
装饰器会自动创建一个缓存字典来存储函数的结果,每次调用函数时,会先检查缓存字典中是否已经存在该参数对应的结果,如果存在则直接返回,否则执行函数体并将结果存入缓存字典。
需要注意的是,@cache
装饰器只能应用于纯函数(即函数的输出只依赖于输入参数,没有副作用),否则可能会导致意外的结果。
做题思路:
ps:1. and 2. 说法不同,思路相同
1.
在这个问题中,我们需要计算爬上楼梯的最小成本。我们可以从最底部的楼梯开始,每次选择爬1级或2级楼梯,并累计每级楼梯的成本。我们的目标是找到一条路径,使得总成本最小。
这段代码使用了递归的方式来解决问题。递归函数dfs
接受一个参数i,表示当前所在的楼梯级数。如果i小于等于1,表示已经到达了楼梯的底部,返回0。否则,递归调用dfs
函数来计算爬到i-1级或i-2级楼梯的最小成本,并加上当前楼梯的成本。然后,返回这两种选择中的较小值。
为了避免重复计算,代码使用了@cache
装饰器来缓存已经计算过的结果。这样,在下次调用dfs
函数时,如果已经计算过相同的参数,就可以直接从缓存中获取结果,避免重复计算。
最终,调用dfs
函数并传入楼梯的总级数len(cost)
,即可得到爬到楼梯顶部的最小成本
2.
要使用这段代码,需要调用`dfs`函数并传入楼梯的总级数`len(cost)`即可。代码会返回爬到楼梯顶部的最小成本。
可以按照以下步骤来使用这段代码:
1. 首先,将你的楼梯每级的成本存储在一个列表中,比如`cost = [10, 15, 20]`,其中`cost[i]`表示爬到第i级楼梯的成本。
2. 然后,将这个列表作为参数传递给`dfs`函数,即`dfs(cost)`。
3. 最后,代码会返回爬到楼梯顶部的最小成本,你可以将其存储在一个变量中或直接使用。
答案:
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
@cache
def dfs(i: int) -> int:
if i <= 1:
return 0
return min(dfs(i - 1) + cost[i - 1], dfs(i - 2) + cost[i - 2])
return dfs(len(cost))