git提交檔案操作
阿新 • • 發佈:2020-07-22
Given the numberk
,return the minimum number of Fibonacci numbers whose sum is equal tok
, whether a Fibonacci number could be used multiple times.
The Fibonacci numbers are defined as:
- F1= 1
- F2= 1
- Fn= Fn-1+ Fn-2, for n > 2.
It is guaranteed that for the given constraints we can always find such fibonacci numbers that sumk
給一個k,求問最少用多少個fibonacci數可以組成這個k。
貪心來做,每次找到一個<=k的最大的fibonacci數,減去它繼續這個過程,最後得到最小次數。
1.f[i + 2] = f[i] + f[i + 1] 兩個相鄰的fibonacci肯定能用一個更大的來代替, 減少次數。
2.f[i] * 2 = f[i - 2] + f[i + 1] 一個數的兩倍可以等於換成一個大的一個小的之和,因此次數不變。
3.f[0] + f[2] + ... + f[2n] = f[2n+1] - 1
f[1] + f[3] + ... + f[2n-1] = f[2n] - 1 如果k>= f[2n] 又不選 f[2n]的話,那麼其他的數的和會小於f[2n],那麼你就需要額外多出元素來湊,同理f[2n+1]
從這3條可以看出每次選<=k的最大的fibonacci數的正確的。
class Solution(object): def findMinFibonacciNumbers(self, k): """ :type k: int :rtype: int """ f1 = f2 = 1 while f2 <= k: f2,f1 = f2 + f1, f2 ans = 0 while f1 > 0: ifk >= f2: k -= f2 ans += 1 f2, f1 = f1, f2 - f1 return ans