题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1 :
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2 :
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
实现代码
public static int ClimbStairs(int n)
{
int sum = 0;
for (int i = 1; i <= n / 2; i++)
{
decimal fenmu = 1, fenzi = 1;
int s = n - i;
for (int j = i; j > 0; j--)
{
fenmu *= s;
s--;
}
for (int j = i; j > 0; j--)
{
fenzi *= j;
}
sum += (int)(fenmu / fenzi);//运用排列组合的知识
}
return sum+1;//补上全是一的情况
}
执行结果
执行结果:通过
执行用时 : 60 ms, 在所有 C# 提交中击败了59.06%的用户
内存消耗 : 13.8 MB, 在所有 C# 提交中击败了5.98%的用户
小的总结
按照自己的想法用排列组合的知识进行了解答,之后看解析了解了动态规划的方法,由动态规划了解到斐波那锲的方法,以下是斐波那锲方法。
官方解答
public static int ClimbStairs2(int n) //fib方法
{
if (n == 1)
return 1;
int first = 1, second = 2;
for (int i = 3; i <= n; i++)
{
int third = first + second;
first = second;
second = third;
}
return second;
}