牛客-劍指offer-跳臺階&變態跳臺階&矩形覆蓋

題目描述

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

雖然一眼就看出來答案,但是還是被題目裏的“先後次序不同算不同的結果”給干擾了一下。居然沒有一眼看出來其實就是個斐波那契數列。orz

public class Solution {
    public int JumpFloor(int target) {
        if(target==1)return 1;
        if(target==2)return 2;
        return (JumpFloor(target-1)+JumpFloor(target-2));
    }
}

再貼個別人的代碼吧

class Solution {
public:
    int jumpFloor(int number) {
        if (number <= 0) {
            return 0;
        }
        if (number == 1) {
            return 1;
        }
        if (number == 2) {
            return 2;
        }
        int first = 1, second = 2, third = 0;
        for (int i = 3; i <= number; i++) {
            third = first + second;
            first = second;
            second = third;
        }
        return third;
    }
};

雖然簡單也要一步一步積累


題目描述

一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

第一眼看題還真被難了一下,看了下評論恍然大悟這不就是數列嗎(摔)真的腦子退化了orz

因爲n級臺階,第一步有n種跳法:跳1級、跳2級、到跳n級
跳1級,剩下n-1級,則剩下跳法是f(n-1)
跳2級,剩下n-2級,則剩下跳法是f(n-2)
所以f(n)=f(n-1)+f(n-2)+...+f(1)
因爲f(n-1)=f(n-2)+f(n-3)+...+f(1)

所以f(n)=2*f(n-1)

 

public class Solution {
    public int JumpFloorII(int target) {
        if (target <= 0) return -1;
        if (target == 1) return 1;
        return 2 * JumpFloorII(target - 1);
    }
}

還有一題矩形覆蓋的和跳臺階其實一毛一樣,抽象分析問題的能力真是太重要了,感覺刷題有點浮躁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章