首先最广泛的方法为递归,直接上代码:
int climbStairs(int n) {
if(n==1){
return 1;
}
if(n==2){
return 2;
}
if(flag[n])
return flag[n];
return flag[n]=climbStairs(n-1)+climbStairs(n-2);
}
当只有一层楼梯时很明显只有一种情况,当有两层楼梯时有2种情况,大步跨进,一步一个脚印。
作为递归出口。
当为三层楼梯时,我们可以先走到第二层,再向上迈,有一种情况;也可以先走到第一层,再向上迈,有两种情况。同理n层楼梯。先走到n-1层,1种情况。走到n-2层,2种情况。
这时就有很多人疑惑了为什么不是climbStairs(n-1)=climbStairs(n-1)+2*climbStairs(n-2)呢?
这是因为当走到n-2层时,若选择一步一步走,那走到n-1时就跟直接走到n-1情况重叠了,无需再次算入次数。因此为代码所示。
flag数组主要是用于记录到达第n层楼梯的次数,不用重复计算。
除了递归我们也可以用循环的方法,直接上代码:
int climbStairs(int n) {
if(n==1){
return 1;
}
if(n==2){
return 2;
}
int first=1,second=2,result=0;
for(int i=3;i<=n;i++){
result=first+second;
first=second;
second=result;
}
return result;
}
一层楼梯和两层楼梯直接返回就行。
first、second赋初值为1,2,就是一层楼梯和两层楼梯的次数。再利用我们推出的公式相加即可得到第三层次数,然后更新first和second为第二层、第三层的次数,那么下次循环得出的result就算第四层的次数,一直进行到n。
多多点赞加关注,谢谢!每天持续更新大家一起努力!!