解题思路
- 第 0 层能 有0种爬法(边界值)
- 第 1 层,有 1 种爬法
- 第 2 层,有 2 种爬法
- 第 3 层 有,3 种爬法
- 第 4 层,有 5 种爬法
1 1 1 1
1 1 2
1 2 1
2 1 1
2 2 - 第 5 层,有 8 种爬法
1 1 1 1 1
1 1 1 2
1 1 2 1
1 2 1 1
2 1 1 1
2 2 1
2 1 2
1 2 2
由此可以的到一个规律,第n层时,爬楼的方法是第n-1层加上与n-2层方法和。
第一次提交代码
class Solution {
public:
int climbStairs(int n) {
if(n==0) return 0;
if(n==1) return 1;
if(n==2) return 2;
int *dp = new int[n+1];
dp[0] = 1;
dp[1] = 2;
for(int i=2;i<n;i++)
{
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n-1];
}
};
一把过,但是内存优化的还是不很好,用到了数组。
第二次提交代码
相比第一次提交的代码,内存从5%优化到87%,提升非常大,因为就用到了前两层的爬楼方法,开一个数组非常浪费内存,同时当数据量越大,内存也就占用越大。
class Solution {
public:
int climbStairs(int n) {
if(n==0) return 0;
if(n==1) return 1;
if(n==2) return 2;
int a = 1;
int b = 2;
for(int i=2;i<n;i++)
{
int c = a + b;
a = b;
b = c;
}
return b;
}
};
好久没写了,写个简单的题目磨磨脑子。个人拙解,勿喷。