1. 程式人生 > >[Leetcode70]爬樓梯

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