LeetCode アルゴリズム動的プログラミング - フィボナッチ数列

目次

Sword Points Offer 10- I. フィボナッチ数列 - LeetCode

答え:

コード:

操作結果:


関数を作成し、 を入力し n 、フィボナッチ数列の最初の項 n (すなわち F(N)) を見つけます。フィボナッチ数列は次のように定義されます。

F(0) = 0、F(1) = 1 
F(N) = F(N - 1) + F(N - 2)、N > 1。

フィボナッチ数列は 0 と 1 で始まり、後続のフィボナッチ数は前の 2 つの数値を加算することによって計算されます。

答えはモジュロ 1e9+7 (1000000007) である必要があります。最初の計算結果が 1000000008 の場合は、1 を返してください。

例 1:

入力: n = 2
出力: 1

例 2:

入力: n = 5
出力: 5

ヒント:

  • 0 <= n <= 100

题解:

  1. まず、値 1000000007 の定数 MOD を定義します。これは、フィボナッチ数の法を取得するために使用されます。
  2. n が 2 未満の場合、フィボナッチ数列では最初の 2 つの数値が 0 と 1 であるため、n が直接返されます。
  3. 3 つの整数変数 p、q、r をそれぞれ 0、0、1 に初期化します。p は前のフィボナッチ数を保存するために使用され、q は現在のフィボナッチ数を保存するために使用され、r は次のフィボナッチ数を保存するために使用されます。
  4. 2 から n までのループを使用し、毎回 p、q、r の値を更新します。q の値を p に代入し、r の値を q に代入して、r の新しい値を (p + q) % MOD として計算します。
  5. ループが終了すると、n 番目のフィボナッチ数である最終結果 r が返されます。

ローリング配列の考え方により、このコードは一定レベルの追加スペースのみを必要とし、n が増加しても追加のスペース消費が増加しないため、コードの効率が大幅に向上します。

代码:

class Solution {
    public int fib(int n) {
        final int MOD = 1000000007;
        if (n < 2) {
            return n;
        }
        int p = 0, q = 0, r = 1;
        for (int i = 2; i <= n; ++i) {
            p = q; 
            q = r; 
            r = (p + q) % MOD;
        }
        return r;
    }
}

运行结果:

おすすめ

転載: blog.csdn.net/qq_62799214/article/details/132917584