509.斐波那契数
当n >= 2时,当前值等于前两个数之和,f(n) = f(n - 1) + f(n - 2)
,边界条件:f(0) = 0, f(1) = 1
利用滑动窗口思想,窗口内有三个值,每次向左移动一位,当前值即为窗口前两数之和。n能取到:左闭有闭
func fib(n int) int {
if n == 0 || n == 1 {
return n
}
l, mid, r := 0, 0, 1
for i := 2; i <= n; i++ {
l = mid
mid = r
r = l + mid
}
return r
}
70.爬楼梯
和斐波那契数一样,但是边界条件变了,边界条件:f(0) = 1, f(1) = 1
func climbStairs(n int) int {
if n == 0 || n == 1 {
return 1
}
l, mid, r := 0, 1, 1
for i := 2; i <= n; i++ {
l = mid
mid = r
r = l + mid
}
return r
}
746.使用最小花费爬楼梯
当前值为一次爬两层楼梯
与爬一层楼梯
花费的最小值,f(i) = min(f(i - 2)+ cost[i - 2], f(i - 1)+ cost[i - 1])
利用滑动窗口,保留爬一层楼梯花费和当前选择花费,以进行下次求解。
初始时可以爬两层或者爬一层,有f(0) = 0, f(1) = 0, f(2) = min(f(0) + cost[0], f(1) + cost[1])
func minCostClimbingStairs(cost []int) int {
l, mid, r := 0, 0, 0
for i := 2; i <= len(cost); i++ {
l = mid
mid = r
r = min(l+cost[i-2], mid+cost[i-1])
}
return r
}
代码随想录文章详解
理论基础
509.斐波那契数
70.爬楼梯
746.使用最小花费爬楼梯
总结
动态规划基础挺容易理解的