You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
class Solution { public: int climbStairs(int n) { if (n==0||n==1) return 1; int pre=cur=1; for(int i=2;i<=n;i++) { int temp=cur+pre; pre=cur; cur=temp; } return cur; } };
别人的:
思路:首先很容易就想到了递归的解法。但是超时了。
public int climbStairs(int n) { if(n < 0) return 0; if(n <= 1) return 1; return climbStairs(n - 1) + climbStairs(n - 2); }
所以采用非递归的方式,其实此题类似于求斐波那契数列的和,但是递归不仅慢还可能溢出。下面采用非递归的方法,其中pre代表前n-1台阶的方法数,current代表第n台阶的方法数。
public int climbStairs(int n) { if (n == 0 || n == 1) return 1; int pre = 1; int current = 1; for (int i = 2; i <= n; i++) { int temp = current + pre; pre = current; current = temp; } return current; }