アルゴリズム leetcode|70. 階段を登る(サビが激しくパンチする)



70. 階段を登る:

あなたが階段を登っているとします。n建物の屋上に行くには階段が必要です。

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

例 1:

输入:
	
	n = 2
	
输出:
	
	2
	
解释:

	有两种方法可以爬到楼顶。
	1. 1 阶 + 1 阶
	2. 2 阶

例 2:

输入:
	
	n = 3
	
输出:
	
	3
	
解释:

	有三种方法可以爬到楼顶。
	1. 1 阶 + 1 阶 + 1 阶
	2. 1 阶 + 2 阶
	3. 2 阶 + 1 阶

ヒント:

  • 1 <= n <= 45

分析します:

  • このアルゴリズムの問​​題に直面して、二代目リーダーは再び考え込んでしまいました。
  • 1 段または 2 段を登ることができます。つまり、初期位置と 1 段目に加えて、n他の段に到達する方法はn - 11 段目またはn - 23 段目からのみです。
  • これは典型的な動的計画法です。初期位置と最初のステップに到達する方法は 1 つだけであり、各ステップに到達するメソッドの総数は動​​的に計算できます。つまり、f(x) = f(x − 1 ) + f(x − 2)
  • 動的計画法はとても良い手法だと思いますが、規則的なので数学的に計算した方が早いですし、最初のいくつかの項目を列挙して定義と組み合わせると、メソッドの総数は各ステップに到達するのはまさにフィボナッチ数列です
  • 動的計画法は→→→の順番でしか計算できない が大きいとやはり1効率が悪い行列のべき乗を高速に行うと二分探索と同等の効率が得られる 数学の知識が先生に還元される興味があるので勉強してみてください しばらくすると理解できますが、しばらくすると忘れてしまいます どうしようもないです 行列高速パワーは行列乗算高速パワーを組み合わせたものです別々に理解してから理解することができますそれを一緒に。nn
  • したがって、動的計画法を最初にマスターし、次に高速指数をマスターすることをお勧めします。一般的な公式や数学的手法については、1 つのインスタンスから他のケースを推測するのは困難です。特定の問題を詳細に分析する必要があります。分析を行うためには、数学的知識自体を習得する必要があります。
  • 最後に、階段を上るには、もちろん、5 段目と 5 段目で横暴になる必要があります。

答え:

さび:

impl Solution {
    
    
    pub fn climb_stairs(n: i32) -> i32 {
    
    
        let sqrt5 = 5f64.sqrt();
        let fibn = ((1f64 + sqrt5) / 2f64).powi(n + 1) - ((1f64 - sqrt5) / 2f64).powi(n + 1);
        return (fibn / sqrt5).round() as i32;
    }
}

行く:

func climbStairs(n int) int {
    
    
    sqrt5 := math.Sqrt(5)
	pow1 := math.Pow((1+sqrt5)/2, float64(n+1))
	pow2 := math.Pow((1-sqrt5)/2, float64(n+1))
	return int(math.Round((pow1 - pow2) / sqrt5))
}

c++:

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

パイソン:

class Solution:
    def climbStairs(self, n: int) -> int:
        sqrt5 = math.sqrt(5)
        fibn = pow((1 + sqrt5) / 2, n + 1) - pow((1 - sqrt5) / 2, n + 1)
        return round(fibn / sqrt5)


ジャワ:

class Solution {
    
    
    public int climbStairs(int n) {
    
    
        final double sqrt5 = Math.sqrt(5);
        final double fibn = Math.pow((1 + sqrt5) / 2, n + 1) - Math.pow((1 - sqrt5) / 2, n + 1);
        return (int) Math.round(fibn / sqrt5);
    }
}

この記事を読んでいただきありがとうございます~
【いいね】【お気に入り】【コメント】へようこそ~三回連続で歩きましょう~
諦めるのは難しいことではありませんが、やり抜くのはカッコいいですね~
みんなで改善できればと思います毎日少しずつ〜この記事は二代目マスターのホワイトハット
が書いています:https://le-yi.blog.csdn.net/ブログオリジナル〜


おすすめ

転載: blog.csdn.net/leyi520/article/details/132272346