Skip to content

Latest commit

 

History

History
53 lines (45 loc) · 1.44 KB

使用最小花费爬楼梯.md

File metadata and controls

53 lines (45 loc) · 1.44 KB

使用最小花费爬楼梯

力扣算法题使用最小花费爬楼梯

这一题和求斐波那契数列基本上是相同的,只不过在每个阶段增加了一个权重,但是出题的人没有描述好问题,实际上是说人站在地面,输入样例[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
}

此处内存消耗较高,在于复制了输入的数组和每次循环都调用了函数,会生成/销毁函数栈,为了更容易看懂,这里不作优化