力扣70.爬楼梯


力扣70. 爬楼梯题解

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

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

注意:给定 n 是一个正整数。

示例 1:

1
2
3
4
5
6
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

1. 1 阶 + 1 阶
2. 2 阶

示例 2:

1
2
3
4
5
6
7
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs

首先看到爬楼梯那么解法第一个肯定就是递归(上次写过)

1
2
3
4
5
6
7
8
9
10
11
12
13
0层楼梯:1种方法

1层楼梯:1种方法

2层楼梯:2种方法 1+1,2

3层楼梯:3种方法 1:(3-1) = 2层楼梯 2:(3-2) = 1层楼梯

n:楼梯数

f(n):有多少方法可以到达楼顶

f(n) = f(n - 1) +f(n - 2)

so easy!

代码

1
2
3
4
5
6
7
8
class Solution {
public int climbStairs(int n) {
if(n == 0) return 1;
if(n == 1) return 1;

return climbStairs(n - 1)+climbStairs(n - 2);
}
}

结果

漂亮,超时了

那么就是我们在递归的过程中大量的重复运算了之前的数据,那我们可以用动态规划来优化

动态规划是什么?就是缓存了一堆数据的迭代,我们把之前计算过的结果缓存下来,就可以减少运算量

首先我们需要一个数组储存运算结果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int climbStairs(int n) {
//声明个数组储存之前计算过的结果
int size = 10000;
int[] f = new int[size];
//设置初始值
f[0] = 1;
f[1] = 1;
//把递归改成迭代
//注意上面有了0和1的结果,要保证n=2时可以进入该循环
for(int i = 2; i <= n; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
}

结果