持续创作,加速成长!这是我参与「掘金日新计划 · 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 。
提示:
题解(贪心):
首先要证明每次减去不超过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;
}
};