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开始推到公式。
我们到的第二个楼梯需要花费的钱就是。
-
到达第0个楼梯需要花的钱 加上 第0个楼梯开始爬需要花的钱
-
到达第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(dpn−1+costn−1,dpn−2+costn−2)
初始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];
};
结语
如果对您有帮助的话,您可以搜搜一下正在努力的迪迦关注一下此公众号吗?谢谢您了。