和为 K 的最少斐波那契数字数目(贪心)
Posted Aline2021-yxz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了和为 K 的最少斐波那契数字数目(贪心)相关的知识,希望对你有一定的参考价值。
题目描述:给你数字 k ,请你返回和为 k 的斐波那契数字的最少数目,其中,每个斐波那契数字都可以被使用多次。
斐波那契数字定义为:
- F1 = 1
- F2 = 1
- Fn = Fn-1 + Fn-2 , 其中 n > 2
数据保证对于给定的 k ,一定能找到可行解。
示例 :
输入:k = 7
输出:2
解释:斐波那契数字为:1,1,2,3,5,8,13,……
对于 k = 7 ,我们可以得到 2 + 5 = 7 。
原题链接:1414. 和为 K 的最少斐波那契数字数——leetcode
题目分析:给我们斐波那契数列以及一个数,要求我们能使用最少的斐波那契数将给定的数归零,我们很难不想到贪心,只要每次选取的斐波那契数能够最大程度的让给定数归零,那选取的数字应该就是最少的。
class Solution
public:
int Big_FibNum(int x)
int x1=1;
int x2=1;
while(x1+x2<=x)
int tmp=x1;
x1+=x2;
x2=tmp;
return x1;
int findMinFibonacciNumbers(int k)
int count=0;
while(k)
k-=Big_FibNum(k);
count++;
return count;
;
一上面思路写出的代码也确实没问题,通过了所有测试用例,但我们刚刚的思路也只是猜测,对于证明,在看了那么多题解后任不能让我自圆其说,所以仅仅说出案例证明:
- 如果给定的数就是斐波那契数,难道我们不直接取最大数吗?如果这个数不是斐波那契数,那如果按照其他方法将其减为斐波那契数,难道还不取最大数吗?
- 贪心算法的每一步都是为了以最小代价获取最大效益,为什么我不直接取一个数,而是要取多个数?况且多个数的和还没有一个数的大(这在官方题解已证明)
如上只是博主的片面理解,如果有更加深入的理解不妨在评论区展示😀
以上是关于和为 K 的最少斐波那契数字数目(贪心)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 2000. 反转单词前缀 / 1414. 和为 K 的最少斐波那契数字数目(贪心证明) / 1725. 可以形成最大正方形的矩形数目
LeetCode 1414 和为K的最小斐波那契数字数目[贪心] HERODING的LeetCode之路