题目描述

自己解法
直觉上采用贪心策略,从大到小选择斐波那契数字,这样可以使得个数总和最少。
时间复杂度
O
(
45
)
O(45)
O(45),空间复杂度
O
(
45
)
O(45)
O(45),因为在
k
≤
1
0
9
k≤10^9
k≤109的范围内,本解法最多有45个斐波那契数。
class Solution:
def findMinFibonacciNumbers(self, k: int) -> int:
Fibonacci = [1,1]
ans = 0
while Fibonacci[-1] <= k:
Fibonacci.append(Fibonacci[-1] + Fibonacci[-2])
p = len(Fibonacci) - 2
while p >= 0:
while Fibonacci[p] > k:
p -= 1
k -= Fibonacci[p]
ans += 1
if k == 0:
break
return ans

官方解答
官方解答也是采取了贪心策略,代码更为简洁,并且给出了贪心策略的严谨证明。
class Solution:
def findMinFibonacciNumbers(self, k: int) -> int:
a = b = 1
fibo = [a, b]
while a + b <= k:
fibo.append(a + b)
a, b = b, a + b
ans = 0
for num in fibo[::-1]:
if k >= num:
ans += 1
k -= num
return ans
证明参考:官方解答。
本文探讨了解决斐波那契数问题的一种贪心策略,通过从大到小选择斐波那契数字来达到最小化数字个数的目的。介绍了算法的时间复杂度和空间复杂度,并对比了两种实现方式,同时提供了官方解答的严谨证明。
- LeetCode&spm=1001.2101.3001.5002&articleId=107154188&d=1&t=3&u=7d9d4efd5fa6434db9aaf338647612cb)
975

被折叠的 条评论
为什么被折叠?



