1. 程式人生 > 實用技巧 >git提交檔案操作

git提交檔案操作

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:
            if
k >= f2: k -= f2 ans += 1 f2, f1 = f1, f2 - f1 return ans