746 leetcode 简单

文章讲述了如何使用递归和动态规划方法解决爬楼梯问题,通过最小化每步上楼梯的花费,计算到达楼梯顶部的最低成本。利用@cache装饰器优化递归过程,避免重复计算。
摘要由CSDN通过智能技术生成

746. 使用最小花费爬楼梯

已解答

简单

给你一个整数数组 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))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值