【leetcode C語(yǔ)言實(shí)現(xiàn)】劍指 Offer 10 II.青蛙跳臺(tái)階問(wèn)題

題目描述

一只青蛙一次可以跳上1級(jí)臺(tái)階,也可以跳上2級(jí)臺(tái)階。求該青蛙跳上一個(gè) n 級(jí)的臺(tái)階總共有多少種跳法。

答案需要取模 1e9+7(1000000007),如計(jì)算初始結(jié)果為:1000000008,請(qǐng)返回 1。

示例 1:

輸入:n = 2
輸出:2
示例 2:

輸入:n = 7
輸出:21
提示:

0 <= n <= 100

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof

解題思路

自頂向下分析,由于一次只能跳1級(jí)臺(tái)階或者2級(jí)臺(tái)階,因此青蛙跳到第n級(jí)之前要么在第n-1級(jí)臺(tái)階上,要么在第n-2級(jí)臺(tái)階上,若跳上n級(jí)臺(tái)階的跳法為f(n),則f(n) = f(n-1) + f(n-2);
自底向上分析,只有1級(jí)臺(tái)階時(shí),有1種跳法;有2級(jí)臺(tái)階時(shí),有2種跳法(2次各跳1級(jí),一次跳2級(jí));有3級(jí)臺(tái)階時(shí),有3種跳法(從第1級(jí)跳2級(jí)直接到第3級(jí),從第2級(jí)跳1級(jí)到第3級(jí));以此類推......這就是斐波那契數(shù)列的應(yīng)用。

代碼

int numWays(int n){
    int simp_ways[2] = {1, 1};
    int waysn = 0, way1 = 1, way2 = 1;

    if(n < 2)
    {
        return simp_ways[n];
    }

    for (int i = 2; i <= n; i++)
    {
        waysn = (way1 + way2) % 1000000007;
        way1 = way2;
        way2 = waysn;
    }

    return waysn;
}

測(cè)試代碼及結(jié)果

#include<stdio.h>

int main(void)
{
    // 功能測(cè)試
    printf("n = 5: %d\n", numWays(5));
    printf("n = 10: %d\n", numWays(10));

    // 邊界值測(cè)試
    printf("n = 0: %d\n", numWays(0));
    printf("n = 1: %d\n", numWays(1));
    printf("n = 2: %d\n", numWays(2));

    // 性能測(cè)試
    printf("n = 2: %d\n", numWays(50));
    printf("n = 2: %d\n", numWays(100));
}

執(zhí)行結(jié)果

時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容