リトアニア語 <登り階段> 再帰組み合わせ表

問題の説明:
階段を登っているとします。建物の屋上に到達するまでに n 歩かかります。

一度に1段か2段ずつ登ることができます。建物の屋上に行くには、何通りの方法がありますか?

例 1:

入力: n = 2
出力: 2
説明: 建物の屋上に登るには 2 つの方法があります。
1. 1次+1次
2. 2次

例 2:

入力: n = 3
出力: 3
説明: 建物の頂上に登るには 3 つの方法があります。
1. レベル 1 + レベル 1 + レベル 1
2. レベル 1 + レベル 2
3. レベル 2 + レベル 1
ヒント: 1 <= n <= 45 出典: LeetCode リンク:
https://leetcode-cn. 著作権は com /problems/climbing-stairs は
陵口ネットワークに属します。営利目的での転載の場合は正式な許諾を得た方へ、非営利での転載の場合は出典を明記の上、ご連絡ください。

この質問に関して、私はそれを達成するために 3 つの方法を使用します。1 つ目は単純な再帰であり、必要なコードは 3 行だけですが、提出されたメッセージには、複雑さが高すぎて含まれている内容が多すぎるため、時間が長すぎると表示されます。繰り返し計算するため、2 番目の方法でも再帰を使用しますが、すでに計算した値を記録するテーブルを追加します。計算するたびに、テーブルにアクセスしてすでに計算済みかどうかを確認するので、節約できます。計算; 3 番目の方法では、反復ループを使用してこれを実現します。コードは以下のように表示されます。

class Solution {
public:
    //递归写法,时间复杂度太高,因为这种递归涉及太多重复计算 
    int climbStairs(int n) {
    if(n==1) return 1;
    else if(n==2) return 2;
    else  return climbStairs(n-1)+climbStairs(n-2);
     }
};
//同样采用递归,但用了个哈希表把每次算过的值都记录起来,在每次递归时先去表中查找有无该值,没再自己算,避免重复的计算
    map<int,int> M1;   //用map容器来存储已经计算过的值
    int climbStairs(int n) {
    int i=1;
     if(n==1) return 1;
     if(n==2) return 2;
     if(M1.end()!=M1.find(n))
     {
         map<int,int>::iterator pos = M1.find(n);
         return pos->second; 
     }else
         {
         int result = climbStairs(n-1)+climbStairs(n-2);
         M1.insert(pair<int,int>(n,result));
         return result;
         } 
     }
}; 
  
class Solution {
public:
    //最后再采用迭代循环的方法  画个图就很容易理解,每一次都是前两次的相加
    int climbStairs(int n) {
    if(n==1) return 1;    
    if(n==2) return 2;
    int result = 0;
    int pre = 2;
    int prepre = 1;
    for(int i = 3;i<=n;i++)
    {
        result=pre+prepre;
        prepre=pre;
        pre=result;
    }
    return result;
    }
 };

おすすめ

転載: blog.csdn.net/mc10141222/article/details/123736404