和为 K 的最少斐波那契数字数目(2022-2-3)每日一练

1414. 和为 K 的最少斐波那契数字数目(2022-2-3)

给你数字 k ,请你返回和为 k 的斐波那契数字的最少数目,其中,每个斐波那契数字都可以被使用多次。

斐波那契数字定义为:

  • F1 = 1
  • F2 = 1
  • Fn = Fn-1 + Fn-2 , 其中 n > 2 。

数据保证对于给定的 k ,一定能找到可行解。

示例 1:

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

提示:

  • 1 <= k <= 10^9

解题思路

基础解法:找到小于k的最大斐波那契数f,然后从f向左寻找小于k和f之差的数

var findMinFibonacciNumbers = function(k) {
    let arr = [1,1],count = 0
    for(let i = 2; arr[i-1] + arr[i-2] <= k;i++){
        arr[i] = arr[i-1] + arr[i-2]
    }
    for(let i = arr.length-1; k; i--){
        k = k-arr[i] >= 0 ? ++count && k-arr[i] : k
    }
    return count
};

进阶解法:二分查找(虽然我也不知道为啥要用二分查找)或者回溯(看到回溯法我惊呆了!)

这里贴上大佬的回溯,原文在这里

var findMinFibonacciNumbers = function(k) {
    if(k == 0)
        return 0
    let f = 1, f1 = 1
    while(f1 <= k){
        const tmp = f
        f = f1
        f1 += tmp
    }
    return 1 + findMinFibonacciNumbers(k - f)
};
上一篇:python多态性与方法重载


下一篇:【题解】[NOI2015] 寿司晚宴