[编程题] lc[70. 爬楼梯
[编程题] lc:70. 爬楼梯
题目描述
输入输出例子
方法1:普通递归
思想:化为子问题
Java代码
//方法1:普通递归
public int climbStairs(int n) {
if(n==1){return 1;}
if(n==2){
return 2;
}else{
return climbStairs(n-1)+climbStairs(n-2);
}
}
方法2:滑动数组(指针从左往右滑动)
思想:让三个指针p q r,构成滑动数组,不断从左往右滑动;其中p指向n=1情况的值的前一个节点,q指向n=1的情况,r指向n=2的情况
见图解:
//方法2:滑动数组的方式(从左往右滑)
public int climbStairs3(int n) {
int p = 0; //pre节点指针
int q = 1; //相当于n=1的情况的指针
int r = 2; //相当于n=2的情况的指针
for(int i=1;i<n;i++){ //传入2,只需要移动1次,传入3,只需移动2次
p = q;
q = r;
r = p+q;
}
return q;
}
方法2:滑动数组(指针从右往左滑动)
思想:让三个指针p q r,构成滑动数组,不断从右往左滑动;
Java代码
//方法2:滚动数组
public int climbStaires2(int n){
int p,q=0;int r=1;
for (int i = 0; i < n; i++) {
p = q;
q = r;
r = p+q;
}
return r;
}
方法4:满足斐波那契直接使用数学公式
公式:
代码
//方法3:发现构造的这个数组符合斐波那契数列,直接用公式
public static double climbStaires3(int n){
int[] arr = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
double sqrt = Math.sqrt(5);
return (int)(1/sqrt *(Math.pow((1+sqrt)/2,n+1)-Math.pow((1-sqrt)/2,n+1)));
}
方法4:动态规划
思想:
代码
//方法2:动态规划(空间换时间)
public int climbStairs2(int n) {
if(n<=2){return n;}
//n>=3的情况使用dp处理
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];
}