時間:2019年4月12日
タイトル:Clibing Srairs
難易度:簡単
著者:小鹿
トピック:階段を登ります
あなたは階段のケースを登っています。それは取るn個のトップに到達するための手順を。
あなたが1つのまたは2のいずれかのステップを登ることができますたびに。あなたが一番上に登ることができますどのように多くの異なる方法で?
注意:与えられたnは正の整数になります。
あなたは階段を登っていると仮定します。あなたは必要とするn個のあなたの屋根に到達するために。
たびに、1つのまたは2つのステップを登ることができます。どのように多くの異なる方法がそれの屋根に登ることができますか?
注:与えられたnは正の整数です。
例1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
例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
単語
▉アルゴリズムのアイデア
二種類のソリューション、第再帰;第2のダイナミックプログラミング。
1)再帰的な実装:
まず第一に、我々は再帰の使用が満たすべき三つの条件を知っている必要があり、我々は以前の前の質問の種類について話していた、一連の記事に編成後ろに私は誰もが学ぶことのために簡単になります。そして、再帰式を書き、その後、再帰的なコードに変換する前に、私たちが言っている方法に従ってください。私たちは、再帰的な欠点は、要素に再帰的な計算を繰り返すことを警戒しているがあることを覚えていれば私たちは、再帰的な時間の複雑さは、O(2 ^ n)があるでしょう。ので、計算が指数関数的成長に時間複雑で、その結果、構成要素で繰り返されます。
時間の複雑さを低減するために、我々は、要素の繰り返しにわたって記録された値を記録するために、ハッシュテーブルを使用することができるが、空間的複雑で、その結果、ストレージのための追加スペースを適用する必要がO(N)のO(n)は、減少時間複雑であり、また、それは時間のためのスペースのアイデアを利用しました。
ダイナミックプログラミングの2)実装:
我々は慎重に再帰モードを見つけることができるか、上記の最適化を図ることができ、我々は実際には、我々は例えば(これに値を保存する前に、2つの値を計算し、ボトムアップから考えるのは、別の方法を考えるために:計算fは(6) (4)その上に)、我々は保存前の値ができない(5)と、F値fを知っている必要があり、この時間は宇宙の複雑さOに還元することができる(1)。
▉コード器具(再帰的に)
再帰最適化されています。
//递归实现
//时间复杂度为 O(n),空间复杂度为 O(n)
var climbStairs = function(n) {
let map = new Map();
if(n === 1) return 1;
if(n === 2) return 2;
if(map.has(n)){
return map.get(n);
}else{
let value = climbStairs(n - 1) +climbStairs(n - 2);
map.set(n,value);
return value;
}
};
▉コード実装(動的プログラミング)
//动态规划
//时间复杂度为O(n) 空间复杂度为O(1)
var climbStairs = function(n) {
if(n < 1) return 0;
if(n === 1) return 1;
if(n === 2) return 2;
let a = 1;
let b = 2;
let temp = 0;
for (let i = 3; i < n + 1; i++) {
temp = a + b;
a = b;
b = temp;
}
return temp;
}
「普通の農家に不本意コード、」自分自身のセルフ・プログラミングの話を記録するすべての方法:いいえ。私は個人的に国民に注意を歓迎します。
他のトピックを解決LeetCode、Githubに:https://github.com/luxiangqiang/JS-LeetCode