您现在的位置是:首页 >技术交流 >leetcode 70. 爬楼梯网站首页技术交流
leetcode 70. 爬楼梯
简介leetcode 70. 爬楼梯
题目详情
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1 阶 + 1 阶
2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶
1 阶 + 2 阶
2 阶 + 1 阶
leetcode70
方法一:递归解决
递归方法解决主要是注意递归出口和递归主体的写法,递归本身效率不高,会计算更多的操作。
public int climbStairs(int n) {
if (n == 1 || n == 2) {
return n;
} else {
return climbStairs(n-1) + climbStairs(n - 2);
}
}
但是本题用递归的方法由于效率太低,会导致超运行时间
方法二:动态规划之带备忘录实现
动态规划五步走解题:动态规划理论基础
1、确定dp数组以及下标的含义
dp[i]的定义为:第i个数的爬楼梯种数是dp[i]
2、确定递推公式
首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,再上一个台阶就是dp[i]。
然后dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,再上二个台阶就是dp[i]。
所以dp[i] = dp[i - 1] + dp[i - 2]
3、dp数组如何初始化
题目给好dp[1] = 1,dp[2] = 2
4、确定遍历顺序
dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
5、举例推导dp数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],当N为5的时候,dp数组应该是如下的数列:
1 2 3 5 8
public int climbStairs(int n) {
int dp [] = new int[n + 1]; // 这里初始化为n+1,不使用n=0这个位置
int method_numbers = 0;
// 边界初始条件
if (n == 1 || n == 2) {
return n;
}
// dp数组初始化
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
方法三:动态规划之自底向上法推导法
每次推导过程中记录前面两个位置的值即可。
public int climbStairs(int n) {
// 边界初始条件
if (n == 1 || n == 2) {
return n;
}
// dp数组初始化
int dp_1 = 1;
int dp_2 = 2;
int result = 0; // 存储返回值
for (int i = 3; i <= n; i++) {
result = dp_1 + dp_2;
// 推理更新
dp_1 = dp_2;
dp_2 = result;
}
return result;
}
这个方法需要记录2个单位的存储,效率最高。
ps:计划每日更新一篇博客,今日2023-05-15,日更第二十九天。
昨日更新:
leetcode 509. 斐波那契数
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。