爬楼梯
假设你正在爬楼梯。需要 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个台阶,只有一种爬法;
2个台阶,则要么第一步走1阶,要么第一步走2阶所以2个台阶就是2种走法
3个台阶,离第3个台阶第1近(相差1个台阶)的台阶走法+离第3个台阶第2近(相差2个台阶)的台阶走法
穷举法,依次类推...
第n个台阶走法为f(n-2)+f(n-1)
源码:
// 解法1循环累加
func climbStairs1(n int) int {
if n == 1{
return 1
}
if n == 2{
return 2
}
pre := 2
prepre := 1
result := 0
for i:=3;i<=n;i++{
result = pre +prepre
prepre = pre
pre = result
}
return result
}
// 解法2递归
// 对于重复计算的点使用map存起来,减少重复计算
var tmp = make(map[int]int,0)
func climbStairs2(n int) int {
if n == 1{
return 1
}
if n == 2{
return 2
}
cnt,existed := tmp[n]
if existed{
return cnt
}
cnt = climbStairs2(n-2) + climbStairs2(n - 1)
tmp[n] = cnt
return cnt
}