【LeetCode每日一题】1414. 和为 K 的最少斐波那契数字数目

148 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。 个人博客链接:bbstudy.net/

1414. 和为 K 的最少斐波那契数字数目

LeetCode 1414,点击题目可直接跳转至LeetCode

题意

给你数字 k ,请你返回和为 k 的斐波那契数字的最少数目,其中,每个斐波那契数字都可以被使用多次。

斐波那契数字定义为:

  • F1 = 1

  • F2 = 1

  • Fn = Fn-1 + Fn-2 , 其中 n > 2 。

    数据保证对于给定的 k ,一定能找到可行解。

示例 1:

输入:k = 7
输出:2 
解释:斐波那契数字为:1,1,2,3,5,8,13,……
对于 k = 7 ,我们可以得到 2 + 5 = 7

示例 2:

输入:k = 10
输出:2 
解释:对于 k = 10 ,我们可以得到 2 + 8 = 10

示例 3:

输入:k = 19
输出:3 
解释:对于 k = 19 ,我们可以得到 1 + 5 + 13 = 19

提示:

  • 1<=k<=1091 <= k <= 10^9

题解(贪心):

首先要证明每次减去不超过k的最大斐波那契数字,直到k变为0,这样选取的斐波那契数目最少,证明还请见官方题解

  • 首先找到所有不超过k的斐波那契数字,并依次放入数组中
  • 然后从最后一位斐波那契数字开始遍历,每次都用k减去不超过k的最大斐波那契数字,并更新k值,每找到一个就加一。代码如下所示。

C++代码:

class Solution {
public:
    int findMinFibonacciNumbers(int k) {
        vector<int>c;
        c.push_back(1);
        int a=1,b=1;
        while(a+b<=k){
            int m=a+b;
            c.push_back(m);
            a=b;
            b=m;
        }
        int sum=0;
        for(int i=c.size()-1;i>=0;--i){
            int ans=c[i];
            if(k>=ans){
                k-=ans;
                sum++;
            }
        }
        return sum;
    }
};