目次
ソードポイントオファー 10- II. カエルの階段ジャンプ問題
カエルは一度に 1 段または 2 段飛び上がることができます。カエルが段差を飛び上がる方法は何通りあるのか調べてみましょう
n
。答えはモジュロ 1e9+7 (1000000007) である必要があります。最初の計算結果が 1000000008 の場合は、1 を返してください。
例 1:
入力: n = 2 出力: 2例 2:
入力: n = 7 出力: 21例 3:
入力: n = 0 出力: 1ヒント:
0 <= n <= 100
题解:
可能性の数に関する質問は一般に再帰的です。つまり、f(n) と f(n−1)...f(1) の間には関連性があります。
まず、n 段をジャンプする方法が f(n) 通りあると仮定します。カエルの最後のステップには、1 つまたは 2 つのステップをジャンプするという 2 つの状況しかありません。
- 最後のステップがステップ 1 にジャンプする場合、残りのステップは n-1 個あり、ジャンプする方法は f(n-1) 通りあります。
- 最後のステップが 2 ステップまでジャンプする場合、残りは n-2 ステップあり、f(n-2) 通りのジャンプ方法があります。
したがって、f(n) = f(n-1) + f(n-2)、つまり、n ステップ上にジャンプするジャンプ方法の数は、n-1 ステップ上にジャンプするジャンプ方法の数に等しいです。 n-2 ジャンプ ステップの数は、まさにフィボナッチ数列の再帰的特性です。
開始条件:
- カエルのジャンプ問題: f(0)=1、f(1)=1、f(2)=2;
- フィボナッチ数列の問題: f(0)=0、f(1)=1、f(2)=1。
カエルのジャンプ問題では、f(0) = 1 は、段差がない場合、カエルはすでに終点にいるため、ジャンプする方法は 1 つしかないことを意味します。フィボナッチ数列の問題では、f(0) = 0 はフィボナッチ数列の最初の項が 0 であることを意味します。
代码:
class Solution { public int numWays(int n) { if(n<2) return 1; int p=0,q=1,r=1; for(int i=2;i<=n;i++){ p=q; q=r; r=(p+q)%1000000007; } return r; } }
运行结果: