LeetCode 70 Climbing Stairs

来源:互联网 发布:域名实名审核通过时间 编辑:程序博客网 时间:2024/05/17 22:36

题目:

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;    }};