70-爬楼梯(Go)

19 阅读1分钟

题目

题目来源:Leetcode第70题

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

 

示例 1:

输入: n = 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入: n = 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

 

提示:

  • 1 <= n <= 45

我的代码

1. 初始思路:递归

func climbStairs(n int) int {
    if n <= 2 {
       return n
    }
    return climbStairs(n-1) + climbStairs(n-2)
}

问题:运行结果超时

2. 动态规划

采用滚动数组的策略:

func climbStairs(n int) int {
    p, q, r := 0, 0, 1
    for i := 1; i <= n; i++ {
       p = q
       q = r
       r = p + q
    }
    return r
}

image.png

注意

过程中我犯了一个小问题,就是没有分清p, q, r = q, r, p+q这种并行赋值和上述顺序赋值的区别,我下面用一个例子来说明:

package main

func main() {
    a, b, c := 1, 2, 3
    a, b, c = b, c, a+b
    println(a, b, c)
}

输出结果:2,3,3

package main

func main() {
    a, b, c := 1, 2, 3
    a = b
    b = c
    c = a + b
    println(a, b, c)
}

输出结果为2,3,5

这也就说明,并行赋值是先计算后赋值,表达式右侧的变量都以原始值计算,而顺序赋值则可以有效的更新变量值,再相加。