[Leetcode70]爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。

这道题主要是找规律。这道题的规律比较简单,首先是把n除以2确定排列组合中最多可以出现几次2,然后将分别求出每种不同2的个数的排列组合有多少种可能。

举个例子,当n=9时,9/2=4余1。所以方案中2出现的个数可以是0、1、2、3、4共五种,而每种里2出现的位置为C_{n-i}^i,其中i为2的个数。所以一共有N = C_{9}^0 +C_{8}^1 +C_{7}^2 +C_{6}^3 +C_{5}^4 =55种可能。

python:

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        flag = n / 2
        res = 1
        for i in range(1,flag+1):
            c = i
            s = n - i
            z = s - 1
            while i > 1:
                c *= (i - 1)
                s *= z
                i -= 1
                z -= 1
            res += (s / c)
        return res

C++比较麻烦点,需要给 i 另外复制一个值用于计算阶乘,同时要讲 s 的数据类型设为 double 防止溢出: 

class Solution {
public:
    int climbStairs(int n) {
        int flag = n / 2;
        double res = 1;
        for(int i = 1; i <= flag;i++){
            int j = i;
            double c = j;
            double s = n - j;
            int z = s -1;
            while(j > 1){
                c *= (j - 1);
                s *= z;
                j -= 1;
                z -= 1;
            }
            res += (s / c);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_40501689/article/details/82951802