0%

LeetCode.爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。

  • 示例 1:
    输入:2
    输出:2
    解释: 有两种方法可以爬到楼顶。

  • 示例 2:
    输入: 3
    输出: 3
    解释: 有三种方法可以爬到楼顶。

动态规划解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
object ClimbStairs {

def main(args: Array[String]): Unit = {
println(climbStairs(3))
println(climbStairs(39))

println(climbStairs1(3))
println(climbStairs1(39))

println(climbStairs2(3))
println(climbStairs2(39))
}

def climbStairs(n: Int): Int = {
if (n == 1) return 1
if (n == 2) return 2
climbStairs(n - 1) + climbStairs(n - 2)
}

/**
* O(n), O(n)
*/
def climbStairs1(n: Int): Int = {
if (n == 1) return 1
if (n == 2) return 2
val dp = new Array[Int](n)
dp(0) = 1
dp(1) = 2
for (l <- 2 until n) {
dp(l) = dp(l - 1) + dp(l - 2)
}
dp(n - 1)
}

/**
* O(n), O(1)
*/
def climbStairs2(n: Int): Int = {
if (n == 1) return 1
if (n == 2) return 2
var i = 1
var j = 2
var res = 0
for (l <- 2 until n) {
res = i + j
i = j
j = res
}
res
}
}