爬楼梯
题目大意:第n阶,可以由n-1和n-2阶爬上去,那么爬到第n阶有多少种方法?
思路:
我们设 爬到第n阶,有 Sn 种方法。
则:Sn=Sn-1+Sn-2 (可以由n-1和n-2阶爬上去)
并且S0=S1=1 (因为S1=1,并且S2=2,所以S0=1)
代码实现:
递归实现(不提倡)
我们很容易想到下面的递归代码,我们从n出发,一直递归到0和1,这是一种思路,但是时间复杂度比较高(leetcode上通过不了)
/**
* 爬楼梯
*/
public class PLT {
public static void main(String[] args) {
System.out.println(climbStairs(2));
}
public static int climbStairs(int n) {
if(n<0)
return 0;
if(n == 0 || n == 1){
return 1;
}
else return climbStairs(n-1) + climbStairs(n-2);
}
}
-
循环实现(3步曲)
考虑 i 情况下:设a=Si-1,b=Si-2,sum = Si
i=i+1时:Si+1=Si+Si-1 => a= sum,b=a (既:i=i+1时,a为i=i时的sum的值,b为i=i时的a的值 )
并且i=1时,a= 1,b=0,sum= 1
然后可以得出代码:
public static int climbStairs2(int n) { if(n<0) return 0; if(n == 1) return 1; //i=1时 int a=1,b=0,sum=1; //从2开始,并且要加到i=n for(int i=2;i<=n;i++){ b=a; //先赋值,再求和 a=sum; //i=i+1时:S~i+1~=S~i~+S~i-1~ => a= sum,b=a (既:i=i+1时,a为i=i时的sum的值,b为i=i时的a的值 ) sum = (a+b); } return sum; }