[グリーディ] B_5373。Kのフィボナッチ数の最小数の合計(プレイテーブル)

1.タイトルの説明

数kを与えるには、合計kであるフィボナッチ数の最小数を返します。各フィボナッチ数は複数回使用できます。

フィボナッチ数は次のように定義されます。

  • F1 = 1
    F2 = 1
    Fn = Fn-1 + Fn-2、ここでn> 2。

データは、与えられたkに対して、実行可能な解が見つかる必要があることを保証します。

ヒント:1 <= k <= 10 ^ 9

输入:k = 7
输出:2 
解释:斐波那契数字为:1,1,2,3,5,8,13,……
对于 k = 7 ,我们可以得到 2 + 5 = 7 。

输入:k = 19
输出:3 
解释:对于 k = 19 ,我们可以得到 1 + 5 + 13 = 19 。

方法1:貪欲

必要な最小数が使用されます。つまり、最初にkに近い比較的大きな数しか使用できません。私のアプローチは、最初にファブを前処理し、次に後ろから前に列挙して、大きな数を使用することです。

public int findMinFibonacciNumbers(int k) {
    List<Integer> fab = new ArrayList<>();
    fab.add(1);
    fab.add(1);
    while (fab.get(fab.size()-1) < k) {
        int t = fab.get(fab.size()-1) + fab.get(fab.size()-2); 
        fab.add(t);
    }
    int cnt = 0;
    for (int i = fab.size()-1; i >= 0; i--) {
        while (k >= fab.get(i)) {
            k -= fab.get(i);
            cnt++;
        } 
    }
    return cnt;
}

複雑さの分析

  • 時間の複雑さ: O(n)
  • スペースの複雑さ: O(n)
元の記事714件を公開 賞賛された199件 50,000件以上の表示

おすすめ

転載: blog.csdn.net/qq_43539599/article/details/105615536