[Ganancioso] B_5373 A soma do número mínimo de números de Fibonacci de K (mesa de jogo)

1. Título Descrição

Para fornecer o número k, retorne o número mínimo de números de Fibonacci que são soma k, onde cada número de Fibonacci pode ser usado várias vezes.

Os números de Fibonacci são definidos como:

  • F1 = 1
    F2 = 1
    Fn = Fn-1 + Fn-2, em que n> 2.

Os dados garantem que, para um determinado k, seja necessário encontrar uma solução viável.

Dica: 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 。

Método 1: Ganância

O menor número necessário é usado, o que significa que só podemos usar um número relativamente grande próximo de k primeiro. Minha abordagem é pré-processar o fab primeiro e depois enumerar de trás para frente, tentar usar números grandes.

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;
}

Análise de complexidade

  • Complexidade do tempo: O ( n ) O (n)
  • Complexidade do espaço: O ( n ) O (n)
Publicado 714 artigos originais · elogiado 199 · 50.000+ visualizações

Acho que você gosta

Origin blog.csdn.net/qq_43539599/article/details/105615536
Recomendado
Clasificación