一、题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
https://leetcode.cn/problems/climbing-stairs/
二、题解
1.代码
class Solution {
public:
int climbStairs(int n) {
int a[3]={1,2,3};
if(n<=3)return a[n-1];
else{
a[0]=a[1];
a[1]=a[2];
for(int i=4;i<=n;i++){
a[2]=a[0]+a[1];
a[0]=a[1];
a[1]=a[2];
}
return a[2];
}
}
};
2.思路
题目中主要有台阶n这个一变量在变化,故可以设置一个一维数组s[n]表示上到第n个台阶的方法。
思考:怎么得到s[n],或者说怎么爬到第n个台阶。
答案:有两种情况:
- 在第n-1个台阶时再上一个台阶就爬到第n个台阶。
- 在第n-2个台阶时再上两个台阶就爬到第n个台阶了。
所以s[n]=s[n-1]+s[n-2];
(问:当在n-2个台阶时不是有两种情况吗,①:爬两次:一次只爬一个台阶,②:爬一次:一次性爬两个台阶。)
只有一种,因为在n-2时爬一个台阶到达n-1,与第一种情况重复,故在n-2时只能一次性爬两个台阶
总结
也可用递归方式去做
int degui(int x){
if(x>=0){
if(x==0||x==1)return 1;
else{
return degui(x-1)+degui(x-2);
}
}
else return 0;
}
但效率不高
这算是研一第一道题纪念一下,多刷题多刷题,不刷三年后会拿不到sp/ssp!!!切记切记