Problem
Given an integer k
, **return the minimum number of Fibonacci numbers whose sum is equal to **k
. The same Fibonacci number can be used multiple times.
The Fibonacci numbers are defined as:
F1 = 1
F2 = 1
Fn = Fn-1 + Fn-2
forn > 2.
It is guaranteed that for the given constraints we can always find such Fibonacci numbers that sum up to k
.
Example 1:
Input: k = 7
Output: 2
Explanation: The Fibonacci numbers are: 1, 1, 2, 3, 5, 8, 13, ...
For k = 7 we can use 2 + 5 = 7.
Example 2:
Input: k = 10
Output: 2
Explanation: For k = 10 we can use 2 + 8 = 10.
Example 3:
Input: k = 19
Output: 3
Explanation: For k = 19 we can use 1 + 5 + 13 = 19.
Constraints:
1 <= k <= 10^9
Solution (Java)
class Solution {
public int findMinFibonacciNumbers(int k) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
int prev = 1;
int curr = 1;
while (prev <= k) {
int n = prev + curr;
prev = curr;
curr = n;
list.add(n);
}
int count = 0;
int num = k;
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i) <= num) {
count++;
num = num - list.get(i);
}
}
return count;
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).