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