题目链接:
题目大意:
给定 n 级阶梯, 一次可以且仅可以往上攀登 1 或 2 级, 问共有多少种爬完这些楼梯的方式 ;
假设 n 为正整数 ;
例如: 给定: n = 2, 则输出应为: 2 ; ( [1, 1], [2] 两种方式 )
例如: 给定: n = 3, 则输出应为: 3 ; ( [1, 1, 1], [1, 2], [2, 1] 三种方式 )
解题过程:
(1) 题意很明显, 就类似是将若干个 1 和/或 2 作排列组合凑出 n ;
(2) 这里简单考虑逐渐增大每种攀登方式(即 若干个 1 和/或 2 组成的序列)中 2 的数目, 并为各不同序列中的 2 分配位置(即 组合), 便可穷尽所有情况 ;
代码如下:
class Solution {
public:
using PositiveInt = size_t;
PositiveInt
combination(PositiveInt n, PositiveInt k) {
if (k > n) { return 0; }
PositiveInt ret = 1;
for (PositiveInt i = 1; i <= k; i++, n-- ) {
ret *= n;
ret /= i;
}
return ret;
}
int climbStairs(int n) {
int ret = 0;
for ( size_t i = 0; 2*i <= n; i++ ) {
auto countOne = n - 2*i;
auto countTotal = countOne + i;
ret += combination(countTotal, i);
}
return ret;
}
};
Runtime: 0 ms