您的位置:首页 > 大数据 > 人工智能

LeetCode 70 Climbing Stairs

2017-08-02 14:27 429 查看
题目:

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

Note: Given n will be a positive integer.
题目链接
题意:

设计一个爬楼梯的情景,假如爬到顶楼需要n步,每次你可以选择踏出一步或两步,问,爬到顶楼的方式有多少种?

已知所给的n一定是一个正整数。

设一次迈两步的次数有 i 次,则一共迈了 n - i 次,在这个数量下,可能的情况是一个组合数C(i, n-i)。i 的范围是 [0, n/2],因为假如一个一个算效率太慢,不能考虑,又因为每两个相邻的组合数之间通过数学推导可以得出一个关系:

C(i-1, j+1) = C(i, j) * (j+1) * i / ((j - i + 1)*(j - i + 2)) 通过观察可得:
当n为偶数时,C(n/2, n - n/2) = 1。

当n为奇书时,C(n/2, n - n/2) = n - n/2

所以由i = n/2,依次递减即可。

代码如下:

class Solution {
public:
int climbStairs(int n) {
long long Cn = n%2 ? n-n/2 : 1;
int ans = Cn;
for (int i = n/2, j = n-i; i > 0; i --, j++) {
Cn = Cn * i * (j + 1) / ((j-i+1) * (j-i+2));
ans += Cn;
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: