關(guān)于爬樓問題的最優(yōu)算法實現(xiàn)

關(guān)于爬樓問題的最優(yōu)算法實現(xiàn)

爬樓問題:假設(shè)有一段n階的樓梯,每次可以爬1階或者2階,問:共有多少種爬樓方式.


分析問題:假設(shè)n階樓梯的爬樓方式有f(n)
當(dāng)n=1時,得到f(1)=1;
當(dāng)n=2時,得到f(2)=2;
當(dāng)n>2時,如果第一步走1步的話則有f(n-1)種方式,如果第一步走2步的話則有f(n-2)種,所以可得:f(n)=f(n-1)+f(n-2);

分析完畢,接下來就是代碼的實現(xiàn)了。
方案一:
由分析很容易想到遞歸的方式來設(shè)計代碼.設(shè)計代碼如下:

unsigned long stepWays(unsigned long num){
    if (num == 1) {
        return 1;
    }
    if (num == 2) {
        return 2;
    }
    return stepWays(num-1)+stepWays(num-2);
}

運行一下代碼測試一下

NSDate *date = [NSDate date];
printf("方案一有%lu種方式",stepWays(45));
NSTimeInterval time = date.timeIntervalSinceNow*-1;
printf("\n耗時:%lfs",time);

結(jié)果如下:

方案一有1836311903種方式
耗時:6.249614s

考慮到時間和空間復(fù)雜度的問題,顯然遞歸并不是一個好的算法解決方案。所以考慮到不使用遞歸的方案二來實現(xiàn)。
方案二:
根據(jù)f(n)=f(n-1)+f(n-2)表達式,設(shè)計代碼如下:

unsigned long stepWays2(unsigned long num){
    if (num == 1) {
        return 1;
    }
    if (num == 2) {
        return 2;
    }
    unsigned long n = 3;
    unsigned long n1 = 1;//f(n-2)
    unsigned long n2 = 2;//f(n-1)
    unsigned long res = 0 ;//f(n)
    while (n <= num) {
        res = n1 + n2;
        n1 = n2;
        n2 = res;
        n ++;
    }
    return res;
}

很明顯方案二這種設(shè)計在復(fù)雜度上來說是最優(yōu)的。驗證一下:

NSDate *date = [NSDate date];
printf("方案二共有%lu種方式",stepWays2(45));
NSTimeInterval time = date.timeIntervalSinceNow*-1;
printf("\n耗時:%lfs",time);

輸出如下:

方案二共有1836311903種方式
耗時:0.000023s

驗證方案二為最優(yōu)解

Demo

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

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,326評論 25 708
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,110評論 2 59
  • 我愛你 你若是化作了孤寂的風(fēng) 我愿心甘情愿地接受你那落寞的冷
    不思中州晚閱讀 256評論 22 8
  • 10月28日,長沙。 與東岳先生學(xué)習(xí)了易經(jīng)與佛教。這里總結(jié)一下對我們影響至深的外來文化——“佛”。 一、來源 說起...
    SteveWolf閱讀 1,529評論 0 1
  • 多想有一雙翅膀, 逃離命運的羈網(wǎng), 能飛向自己的方向, 無論有怎樣的過往, 明明看到想要的前方, 卻輾轉(zhuǎn)在反側(cè)的迷...
    七音聽雨閱讀 488評論 8 5

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