题目
题目来源: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
}
注意
过程中我犯了一个小问题,就是没有分清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
这也就说明,并行赋值是先计算后赋值,表达式右侧的变量都以原始值计算,而顺序赋值则可以有效的更新变量值,再相加。