力扣算法题使用最小花费爬楼梯
这一题和求斐波那契数列基本上是相同的,只不过在每个阶段增加了一个权重,但是出题的人没有描述好问题,实际上是说人站在地面,输入样例[10,15,20]是说第一阶梯为10,第2阶梯为15,第三阶梯为20,实际人是站在 地面的,而且要跨过(注意是跨过不是跨上)最后一阶梯,所以为了方便计算我们应当把数组先修改一下[0,10,15,20,0],这样就更好处理《1》
首先从结果往开始推,用数组$A$表示每个阶梯的权重
如样例
[10,15,20]
先通过方式《1》将A变为
[0,10,15,20,0]
递推方程 $$ F(n) = min(F(n-1)+A[n], F(n-2)+A[n]) $$
递归基(平凡情况) 想象一下没有楼梯,和只有一阶楼梯的情况 $$ F(0) = 0\\ F(1) = 0 $$
兑现代码
func min(a, b int) int {
if a > b {
return b
}
return a
}
func minCost(cost []int) int {
size := len(cost)
var A = make([]int, 0)
A = append(A, 0)//增加地面
A = append(A, cost...)//拷贝
A = append(A, 0)//增加楼梯顶
a, b := 0, 0
for i := 1; i < size+2; i++ {
a, b = b, min(A[i]+a, A[i]+b)
}
return b
}
此处内存消耗较高,在于复制了输入的数组和每次循环都调用了函数,会生成/销毁函数栈,为了更容易看懂,这里不作优化