题目描述
自己解法
直觉上采用贪心
策略,从大到小选择斐波那契数字,这样可以使得个数总和最少。
时间复杂度
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
证明参考:官方解答。