思路:动态规划解决
- dp[i]表示爬n个台阶的方法。
- 状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。(其实这是个斐波那契数列)
- 初始化dp[]
未优化的代码:时间复杂度O(N) 空间复杂度O(N)
//时间复杂度O(N) 空间复杂度O(N)
class Solution {
public int climbStairs(int n) {
if (n <= 1) {//特殊情况处理
return 1;
}
int dp[] = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];//状态转移方程
}
return dp[n];
}
}
上面的代码中,其实只用到了dp[i], dp[i-1], dp[i-2]这三个变量,没必要声明一个数组,用三个变量就行了。
优化后的代码:时间复杂度O(N) 空间复杂度O(1)
//时间复杂度O(N) 空间复杂度O(1)
class Solution {
public int climbStairs(int n) {
if (n <= 1) {//特殊情况处理
return 1;
}
int p = 1;
int q = 2;
for (int i = 3; i <= n; i++) {
int r = p + q;
p = q;
q = r;
}
return q;
}
}