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?
Note: Given n will be a positive integer.
example:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
题意是给一个步数n, 表示需要n个步数才能爬到顶,每次只能走一步或者两步,问一共有多少种走法。
本题的求解还是比较简单的,一看到题目,就可以非常简单的想到递归的走法,即走到n步的时候,其实是n-1和n-2步决定的,所以可以得到推导公式C[n]=C[n-1]+C[n-2] (n>=2)。
需要注意的是C[0]=1,C[1]=1。
递归代码如下:
void climbStairs_helper(int n, int &re)
{
if(n==0)
{
re++;
return ;
}
if(n<0)
{
return ;
}
climbStairs_helper(n-1, re);
climbStairs_helper(n-2, re);
}
int climbStairs(int n)
{
int re=0;
if(n==0||n==1)
{
re=1;
return re;
}
climbStairs_helper(n, re);
return re;
}
这种解法比较简单,但是超时,多了很多重复的计算,其实根据推导公式可以非常简单的写出一个循环,直接得到n的走法
int climbStairs2(int n)
{
if(n==0||n==1)
{
return 1;
}
vector<int> re{n+1,0};
re[0]=1;
re[1]=1;
for(int i=2;i<n+1;i++)
{
re[i]=re[i-1]+re[i-2];
}
return re[n];
}