最小花费爬楼梯

leetcode 746 最小花费爬楼梯

题解

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

确认信息

给到一个数组

a = [0, 15, 35]

根据题意可以知道,我们可以从第0个**(0)和第一个15**开始向上爬,并且是在往上爬的时候才需要付费,所以我们一开始在0或者1的时候是不需要付费的。

初始化dp

先设定一个dp数组,然后dp数组的长度就是我们数组的长度。

定义dp数组每个下标对应的值的意义。

dp[i] 表示当到了第i个楼梯需要花多少钱

计算公式

根据题目信息可以可以知道,我们可以从0或者1开始跳。

所以我们就可以从2开始推到公式。

我们到的第二个楼梯需要花费的钱就是。

  1. 到达第0个楼梯需要花的钱 加上 第0个楼梯开始爬需要花的钱

  2. 到达第1个楼梯需要花的钱 加上 从第1个楼梯开始爬需要花的钱。

根据题意我们知道要最少的,所以我们需要给这两个中取到最小值

公式为:
d p n = m i n ( d p n − 1 + c o s t n − 1 , d p n − 2 + c o s t n − 2 ) dp_n = min(dp_{n-1} + cost_{n-1}, dp_{n-2} + cost_{n-2 }) dpn=min(dpn1+costn1,dpn2+costn2)

初始dp值

现在dp对应的值我们知道了,

公式我们也知道了。

我们就可以初始dp了,

根据题意我可以知道从第0个到第1开始爬是不需要花钱的.

dp[0] = 1

dp[1] = 2

代码实现

dfs实现

const minCostClimbingStairs = (cost: number[]): number => {
    const min = (value1: number, value2: number): number => value1 < value2 ? value1 : value2
    const dfs = (n: number): number => {
        if (n <= 1) return 0
        return min(dfs(n - 1) + cost[n - 1], dfs(n - 2) + cost[n - 2])
    }
    return dfs(cost.length)
};

加入缓存实现

const minCostClimbingStairs = (cost: number[]): number => {
    const cache_map: { [key: number]: number } = {}
    const min = (value1: number, value2: number): number => value1 < value2 ? value1 : value2
    const dfs = (n: number): number => {
        if (n <= 1) return 0
        let value = cache_map[n]
        if (value === undefined) {
            value = min(dfs(n - 1) + cost[n - 1], dfs(n - 2) + cost[n - 2])
            cache_map[n] = value
        }
        return value
    }
    return dfs(cost.length)
};

dp实现

const minCostClimbingStairs = (cost: number[]): number => {
    const min_fun = (a: number, b: number) => a > b ? b : a
    const dp = new Array(cost.length).fill(0);
    for (let i = 2; i <= cost.length; i++) {
        dp[i] = min_fun(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
    }
    return dp[cost.length];
};

截屏2024-09-04 21.13.10

结语

如果对您有帮助的话,您可以搜搜一下正在努力的迪迦关注一下此公众号吗?谢谢您了。

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值