70. Climbing Stairs

weixin_34007291發表於2017-03-04

給出一個樓梯階數,每次只能走一階或兩階,求所有的走法

比較笨的方法

類似雞兔同籠問題,設定oneStepCount和twoStepCount兩個變數,然後利用排列累加,但是需要注意求階乘的時候溢位的問題

斐波那契數列

n=1,2,3,4,5,6,7時,可以得到結果1, 2, 3, 5, 8, 13, 21,顯然這是一個斐波那契數列(但我竟然沒看出來。。),用遞迴或非遞迴方法都可以解

public int climbStairs(int n) {
    if (n == 1) {
        return 1;
    }
    if (n == 2) {
        return 2;
    }
    int x = 3, result = 0, a = 1, b = 2;
    while (x <= n) {
        result = a + b;
        a = b;
        b = result;
        x++;
    }
    return result;        
}

一個另類的解法

觀察這個結果,可以發現另一種規律,假設result[n]存放結果,下標從1開始
n = 4時,結果可以寫成result[4 - 1] * 2 - result[4 - 3],即3 * 2 - 1
n = 5時,結果可以寫成result[5 - 1] * 2 - result[5 - 3],即5 * 2 - 2
依次類推,大膽的猜這個數列的遞推式為result[n] = result[n - 1] * 2 - result[n - 3]
但是需要注意處理n = 1, 2, 3時的情況

public int climbStairs(int n) {
    int[] temp = new int[n];

    if (n == 1) {
       return 1;
    }
    if (n == 2) {
        return 2;
    }
    if (n == 3) {
        return 3;
    }
    temp[0] = 1; temp[1] = 2; temp[2] = 3;
    int x = 3;
    while (x < n) {
        temp[x] = temp[x-1] * 2 - temp[x - 3];
        x++;
    }

    return temp[n-1];
        
}