- 思路:假设我们在第i阶 那我们上到第i阶的方法就是 在(i-1)阶跨一步+上(i-2)阶跨一步;所以我们就有了递归公式 climbStairs(i)= climbStairs(i-1)+ climbStairs(i-2);直接写递归的话时间复杂度过高,所以我们用记忆化递归,即用数组存起每一阶的方法数;
public int climbStairs(int n) {
int[] arr=new int[n+1];
return climb_Stairs(n,arr);
}
public int climb_Stairs(int n,int[] arr) {
if(n==1) return 1;
if(n==0) return 1;
if(arr[n]>0) return arr[n];
arr[n] = climb_Stairs(n-1,arr)+climb_Stairs(n-2,arr);
return arr[n];
}
第二种 亦可以用动态规划,思路是一样的;
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];
}
end~
谢谢!