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