假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
方法一:动态规划
因为可以通过数学归纳法或者推导得出
第i个楼梯可以从第i-1和i-2个楼梯在走一步到达,那么走到i个楼梯的方法为i-1和i-2的方法之和。
定义一个数组dp,dp[i]表示走到i个楼梯的方法的数目。
dp[i]=dp[i-1]+dp[i-2]
public int climbStairs(int n) { if(n<=2){ return n; } int[] dp = new int[n+1];//因为还有第0层 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]有关,因此可以只用两个变量来存储dp[i-1]和dp[i-2],使得原来空间复杂度O(N)变为O(1)
public int climbStairs(int n) { if(n<=2){ return n; } int pre1=1,pre2=2; for(int i=2;i<n;i++){ int temp=pre1+pre2; pre1=pre2; pre2=temp; } return pre2; }