题目
解题思路
因为一定存在解,使用贪心。先构建斐波那契数列,因为k≤10^9,所以数组长度只有四十左右,每次在斐波那契数列中选取≤当前k的值,循环直至当前k能在斐波那契数列中找到。(具体的数学证明题解区讲的很详细)
代码实现
class Solution:
def findMinFibonacciNumbers(self, k: int) -> int:
nums = [1, 1]
# 构建斐波那契数列
for i in range(43):
nums.append(nums[-1]+nums[-2])
# 二分查找数组中小于等于当前k的
def check(num):
l, r = 0, len(nums)-1
while l <= r:
mid = (l + r) // 2
if nums[mid] == num:
return 0
elif nums[mid] < num:
l = mid + 1
else:
r = mid - 1
return nums[r]
res = 0
while 1:
if not check(k):
res += 1
break
k -= check(k)
res += 1
return res