最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(70.爬樓梯問題)

 更新時間:2021年07月16日 14:45:34   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(70.爬樓梯問題),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

[LeetCode] 70. Climbing Stairs 爬樓梯問題

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

Note: Given n will be a positive integer.

Example 1:

Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps

Example 2:

Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step

這篇博客最開始名字叫做爬梯子問題,總是有童鞋向博主反映移動端打不開這篇博客,博主覺得非常奇怪,自己也試了一下,果然打不開。心想著是不是這個博客本身有問題,于是想再開一個相同的帖子,結(jié)果還是打不開,真是見了鬼了。于是博主換了個名字,結(jié)果居然打開了?!進經(jīng)過排查后發(fā)現(xiàn),原來是“爬梯子”這三個字是敏感詞,放到標題里面,博客就被屏蔽了,我也真是醉了,完全是躺槍好么,無奈之下,只好改名為爬樓梯問題了 -。-|||。

這個爬梯子問題最開始看的時候沒搞懂是讓干啥的,后來看了別人的分析后,才知道實際上跟斐波那契數(shù)列非常相似,假設(shè)梯子有n層,那么如何爬到第n層呢,因為每次只能爬1或2步,那么爬到第n層的方法要么是從第 n-1 層一步上來的,要不就是從 n-2 層2步上來的,所以遞推公式非常容易的就得出了:dp[n] = dp[n-1] + dp[n-2]。 由于斐波那契額數(shù)列的求解可以用遞歸,所以博主最先嘗試了遞歸,拿到 OJ 上運行,顯示 Time Limit Exceeded,就是說運行時間超了,因為遞歸計算了很多分支,效率很低,這里需要用動態(tài)規(guī)劃 (Dynamic Programming) 來提高效率,代碼如下:

C++ 解法一:

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return 1;
        vector<int> dp(n);
        dp[0] = 1; dp[1] = 2;
        for (int i = 2; i < n; ++i) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp.back();
    }
};

Java 解法一:

public class Solution {
    public int climbStairs(int n) {
        if (n <= 1) return 1;
        int[] dp = new int[n];
        dp[0] = 1; dp[1] = 2;
        for (int i = 2; i < n; ++i) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n - 1];
    }
}

我們可以對空間進行進一步優(yōu)化,只用兩個整型變量a和b來存儲過程值,首先將 a+b 的值賦給b,然后a賦值為原來的b,所以應(yīng)該賦值為 b-a 即可。這樣就模擬了上面累加的過程,而不用存儲所有的值,參見代碼如下:

C++ 解法二:

class Solution {
public:
    int climbStairs(int n) {
        int a = 1, b = 1;
        while (n--) {
            b += a;
            a = b - a;
        }
        return a;
    }
};

Java 解法二:

public class Solution {
    public int climbStairs(int n) {
        int a = 1, b = 1;
        while (n-- > 0) {
            b += a; 
            a = b - a;
        }
        return a;
    }
}
雖然前面說過遞歸的寫法會超時,但是只要加上記憶數(shù)組,那就不一樣了,因為記憶數(shù)組可以保存計算過的結(jié)果,這樣就不會存在重復(fù)計算了,大大的提高了運行效率,其實遞歸加記憶數(shù)組跟迭代的 DP 形式基本是大同小異的,參見代碼如下:

C++ 解法三:

class Solution {
public:
    int climbStairs(int n) {
        vector<int> memo(n + 1);
        return helper(n, memo);
    }
    int helper(int n, vector<int>& memo) {
        if (n <= 1) return 1;
        if (memo[n] > 0) return memo[n];
        return memo[n] = helper(n - 1, memo) + helper(n - 2, memo);
    }
};

Java 解法三:

public class Solution {
    public int climbStairs(int n) {
        int[] memo = new int[n + 1];
        return helper(n, memo);
    }
    public int helper(int n, int[] memo) {
        if (n <= 1) return 1;
        if (memo[n] > 0) return memo[n];
        return memo[n] = helper(n - 1, memo) + helper(n - 2, memo);
    }
}

論壇上還有一種分治法 Divide and Conquer 的解法,用的是遞歸形式,可以通過,但是博主沒有十分理解,希望各位看官大神可以跟博主講一講~

C++ 解法四:

public class Solution {
    public int climbStairs(int n) {
        if(n <= 1) return 1;       
        return climbStairs(n / 2) * climbStairs(n - n / 2) + climbStairs(n / 2 - 1) * climbStairs(n - n / 2 - 1);
    }
}

Java 解法四:

public class Solution {
    public int climbStairs(int n) {
        if(n <= 1) return 1;       
        return climbStairs(n / 2) * climbStairs(n - n / 2) + climbStairs(n / 2 - 1) * climbStairs(n - n / 2 - 1);
    }
}

其實斐波那契數(shù)列是可以求出通項公式的,推理的過程請參見 知乎上的這個貼子,那么有了通項公式后,直接在常數(shù)級的時間復(fù)雜度范圍內(nèi)就可以求出結(jié)果了,參見代碼如下:

C++ 解法五:

class Solution {
public:
    int climbStairs(int n) {
        double root5 = sqrt(5);
        return (1 / root5) * (pow((1 + root5) / 2, n + 1) - pow((1 - root5) / 2, n + 1));
    }
};

Java 解法五:

public class Solution {
    public int climbStairs(int n) {
        double root5 = Math.sqrt(5);
        double res =  (1 / root5) * (Math.pow((1 + root5) / 2, n + 1) - Math.pow((1 - root5) / 2, n + 1));
        return (int)res;
    }
}

到此這篇關(guān)于C++實現(xiàn)LeetCode(70.爬樓梯問題)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)爬樓梯問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 模擬實現(xiàn)list(迭代器)實現(xiàn)代碼

    C++ 模擬實現(xiàn)list(迭代器)實現(xiàn)代碼

    這篇文章主要介紹了C++ 模擬實現(xiàn)list(迭代器)實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言 數(shù)據(jù)類型詳細介紹

    C語言 數(shù)據(jù)類型詳細介紹

    本文主要講解C語言 數(shù)據(jù)類型,這里整理了詳細的數(shù)據(jù)類型的資料,希望能幫助剛剛開始學(xué)習(xí)C語言的同學(xué)
    2016-08-08
  • C++數(shù)組和指針的區(qū)別與聯(lián)系

    C++數(shù)組和指針的區(qū)別與聯(lián)系

    這篇文章主要介紹了C++數(shù)組和指針的區(qū)別與聯(lián)系,數(shù)組是具有固定大小和連續(xù)內(nèi)存空間的相同數(shù)據(jù)集合,指針是指存放內(nèi)存地址的變量,更多詳細資料請參考下面文章內(nèi)容
    2022-01-01
  • C語言鏈表實現(xiàn)圖書管理系統(tǒng)

    C語言鏈表實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言鏈表實現(xiàn)圖書管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實現(xiàn)類似延時停頓的打字效果

    C++實現(xiàn)類似延時停頓的打字效果

    這篇文章主要介紹的是使用C++實現(xiàn)類似延時停頓的打字效果的代碼,非常的簡單,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • C語言基于EasyX庫實現(xiàn)有圖形界面鐘表

    C語言基于EasyX庫實現(xiàn)有圖形界面鐘表

    這篇文章主要介紹了C語言基于EasyX庫實現(xiàn)有圖形界面鐘表,直線轉(zhuǎn)動端點計算,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中函數(shù)重載與引用的操作方法

    C++中函數(shù)重載與引用的操作方法

    C++中函數(shù)重載允許同名函數(shù)根據(jù)參數(shù)列表的不同而執(zhí)行不同的功能,這依賴于名字修飾或名字改編(Name Mangling)機制,而引用則是為變量創(chuàng)建一個別名,不會開辟新的內(nèi)存空間,本文介紹了C++中函數(shù)重載與引用的操作,感興趣的朋友一起看看吧
    2024-10-10
  • C++實現(xiàn)LeetCode(63.不同的路徑之二)

    C++實現(xiàn)LeetCode(63.不同的路徑之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(63.不同的路徑之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt使用QChart實現(xiàn)動態(tài)顯示溫度變化曲線

    Qt使用QChart實現(xiàn)動態(tài)顯示溫度變化曲線

    Qt的QChart是一個用于繪制圖表和可視化數(shù)據(jù)的類,提供了一個靈活的、可擴展的、跨平臺的圖表繪制解決方案,所以本文就將使用QChart實現(xiàn)動態(tài)顯示3個設(shè)備的溫度變化曲線,感興趣的可以了解一下
    2023-06-06
  • C++11中std::future的具體使用方法

    C++11中std::future的具體使用方法

    這篇文章主要介紹了C++11中std::future的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論

华池县| 西林县| 呼伦贝尔市| 南京市| 双流县| 长岛县| 汝阳县| 额敏县| 平潭县| 普定县| 大埔区| 靖安县| 高陵县| 武定县| 涟水县| 鄂尔多斯市| 湖州市| 威远县| 石狮市| 天水市| 溧水县| 宁晋县| 福安市| 静海县| 靖边县| 堆龙德庆县| 吐鲁番市| 临颍县| 金溪县| 井陉县| 吕梁市| 定陶县| 太康县| 博客| 隆林| 苏尼特左旗| 大竹县| 清水河县| 东城区| 伊春市| 安溪县|