题目描述:
假设你正在爬楼梯。需要 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 x = 0,y=1,sum=0;
for (int i = 0; i < n; i++)
{
sum = x + y; x=y;y = sum;
}
return sum;
}
测试用例:
执行结果:
算法二:排列组合
class Program
{
public static int ClimbStairs(int n)
{
int sum = 0;
for (int i = 0; i <= n / 2; i++)
{
sum += pailie(n-i, i);
}
return sum;
}
public static int pailie(int m, int n)
{
double x = 1, y = 1; int j = m > n ? m : n;
for (int i =m>n?n:m; i>0; i--)
{
x = x * i;
y = y * j; j--;
}
return (int)(y/x);
}
static void Main(string[] args)
{
int n=7;
Console.WriteLine(ClimbStairs(n));
}
}
测试用例:
算法三:动态规划
public static int ClimbStairs(int n)
{
int[] result = new int[n];
if (n > 1)
{
result[0] = 1; result[1] = 2;
for (int i = 2; i <= n - 1; i++) result[i] = result[i - 1] + result[i - 2];
return result[n - 1];
}
else return 1;
}
测试用例:
执行结果: