Minimum Number of Fibonacci Numbers

Interesting problem, fresh out of the oven: https://leetcode.com/problems/find-the-minimum-number-of-fibonacci-numbers-whose-sum-is-k/

1414. Find the Minimum Number of Fibonacci Numbers Whose Sum Is K
Medium
Given the number kreturn the minimum number of Fibonacci numbers whose sum is equal to k, whether a Fibonacci number could be used multiple times.
The Fibonacci numbers are defined as:
  • F1 = 1
  • F2 = 1
  • Fn = Fn-1 + Fn-2 , for n > 2.
It is guaranteed that for the given constraints we can always find such fibonacci numbers that sum 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
Accepted
4,104
Submissions
7,492

The constraint might seem large (10^9), however when you think about the exponential growth of the Fibonacci numbers, you soon realize that the max number of Fibonacci numbers that you'll be operating with is 45, hence it is actually very small.
Compute all the Fibonacci numbers up to k (DP-style, not recursively pls), store them in a cache (to be used later) and also sort them in descending order. Do a DFS approach controlling the recursion with either the index of the sorted Fibonacci numbers, or the k itself (subtracting it as much as you can). Use the cache to optimize the search space. Works fast. Code is below, cheers, ACC.


public class Solution
{
    public int FindMinFibonacciNumbers(int k)
    {
        Hashtable cache = new Hashtable();
        int[] fibarr = GenFin(k, cache);
        return FindMinFibonacciNumbers(k, cache, fibarr, 0);
    }

    private int FindMinFibonacciNumbers(int k, Hashtable cache, int[] fib, int index)
    {
        if (k == 0 || index < 0) return 0;
        if (cache.ContainsKey(k)) return 1;
        if (k - fib[index] < 0) return FindMinFibonacciNumbers(k, cache, fib, index + 1);
        return 1 + FindMinFibonacciNumbers(k - fib[index], cache, fib, index);
    }

    private int[] GenFin(int k, Hashtable cache)
    {
        SortedList<int, int> fib = new SortedList<int, int>();

        int f1 = 1;
        int f2 = 2;
        fib.Add(f1, f1);
        cache.Add(f1, true);
        while (f2 <= k)
        {
            fib.Add(f2, f2);
            cache.Add(f2, true);
            int temp = f1;
            f1 = f2;
            f2 += temp;
        }

        int[] fibarr = new int[fib.Count];
        for (int i = 0; i < fib.Count; i++)
        {
            fibarr[i] = fib.ElementAt(fib.Count - i - 1).Key;
        }

        return fibarr;
    }
}

Comments

Popular posts from this blog

Advent of Code - Day 6, 2024: BFS and FSM

Golang vs. C#: performance characteristics (simple case study)

Advent of Code - Day 7, 2024: Backtracking and Eval