70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
解不开法一:
空间复杂度:$O(1)$
时间复杂度:$O(未知)$
func Climb(x int) int {
if x <= 2 {
return x
}
return Climb(x - 1) + Climb(x - 2)
}
func climbStairs(n int) int {
return Climb(n)
}
很明显,递归求解会进行大量的无用的运算,所以这个方法会超时
解法二:
空间复杂度:$O(1)$
时间复杂度:$O(未知)$
采用一个map进行记忆化,省略不必要的计算
var m map[int]int
func Per(x, y int) (r1, r2 int) {
if v, ok := m[x]; ok {
r1 = v
}
if v, ok := m[y]; ok {
r2 = v
}
return r1, r2
}
func Climb(x int) int {
if x <= 2 {
return x
}
l, r := Per(x - 1, x - 2)
if r == 0 {
r = Climb(x - 2)
m[x - 2] = r
}
if l == 0 {
l = Climb(x - 1)
m[x - 1] = l
}
return l + r
}
func climbStairs(n int) int {
m = make(map[int]int)
return Climb(n)
}
或者我们可以直接使用递推公式来计算
解法三:
空间复杂度:$O(n)$
时间复杂度:$O(n)$
func climbStairs(n int) int {
if n == 1 || n == 2 {
return n
}
var s [1005]int
s[1] = 1
s[2] = 2
for i := 3; i <= n; i++ {
s[i] = s[i - 1] + s[i - 2]
}
return s[n]
}