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: ,
- Complexidade do espaço: ,