問題の説明:
階段を登っているとします。建物の屋上に到達するまでに 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;
}
};