题目来自LeetCode,链接:爬楼梯。具体描述为:假设你正在爬楼梯。需要 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 阶
一看到这种每次都有多种选择可做的,估摸着也就是动态规划的题目,因为这是easy的题目,状态转移也很容易想到。令dp[i]
表示到第i个台阶的方法数,很明显,到第i个台阶只能通过从第i-1个台阶爬一阶或者从第i-2个台阶爬两阶,也就是有dp[i]=dp[i-1]+dp[i-2]
。时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)。
JAVA版代码如下:
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
提交结果如下:
此外像这种动态规划的题目,一般都可以将空间复杂度进一步降低,因为每次的状态只跟前两个有关,直接用两个变量保存即可,从而空间复杂度降为 O ( 1 ) O(1) O(1)。
JAVA版代码如下:
class Solution {
public int climbStairs(int n) {
int dp0 = 1, dp1 = 1;
for (int i = 2; i <= n; ++i) {
int temp = dp1;
dp1 = dp0 + dp1;
dp0 = temp;
}
return dp1;
}
}
提交结果如下:
Python版代码如下:
class Solution:
def climbStairs(self, n: int) -> int:
dp0 = 1
dp1 = 1
for i in range(2, n + 1):
temp = dp1
dp1 = dp0 + dp1
dp0 = temp
return dp1
提交结果如下: