1.对于爬n个楼梯的问题,可以变成(n-1)个楼梯(先爬1阶楼梯)和(n-2)个楼梯(先爬2阶楼梯)的答案和。
即F(N)=F(N-1)+F(N-2),F(1)=1,F(2)=2,明显是斐波那契型的数列。
不断迭代便可得出结果。
时间复杂度:O(N)
C++代码:
class Solution {
public:
int climbStairs(int n) {
if (n <= 2)
return n;
int nd1 = 2, nd2 = 1, result;
for (int i = 3; i <= n; i++)
{
result = nd1 + nd2;
nd2 = nd1;
nd1 = result;
}
return result;
}
};
2.数学方法
对于一组N个数,其中有1个多次出现的数,重复出现k次,则这组数的全排列数为
;有2个多次出现的数,一个数重复出现
次,另一个数重复出现
次,这组数的全排列数为
爬楼梯问题实质上是[n/2]组([]代表向下取整)有
个‘1’和
个‘2’且
的数组全排列数的加和。
即
这个时间复杂度比上一个要差,仅仅是提供思路。
C++代码:
class Solution {
public:
int climbStairs(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
if (n == 2)
return 2;
int result = 1;
for (int i = 1; i <= n / 2; i++)
{
int odd = n - 2 * i;
int even = i;
long long permute = 1;
int min = std::min(even, odd);
for (int j = odd + even; j > max(even, odd); j--)
{
if (min > 1 && permute / min * min == permute)
{
permute /= min;
min--;
}
permute *= j;
}
while (min > 1)
{
permute /= min;
min--;
}
result += permute;
}
return result;
}
};