Java 我正试图解决这个leetcode问题

Java 我正试图解决这个leetcode问题,java,fibonacci,c,c++,c#,python,javascript,go,rust,Java,Fibonacci,C,C++,C#,Python,Javascript,Go,Rust,问题: 给定数字k,返回其和等于k的Fibonacci数的最小数目,以及Fibonacci数是否可以多次使用 斐波那契数定义为: F1 = 1 F2 = 1 Fn = Fn-1 + Fn-2 , for n > 2. 可以保证,对于给定的约束,我们总是可以找到这样的斐波那契数,求和k 问题链接: 例如: 输入:k=7 产出:2 说明:斐波那契数是:1,1,2,3,5,8,13。。。 对于k=7,我们可以使用2+5=7 class Solution { publ

问题:

给定数字k,返回其和等于k的Fibonacci数的最小数目,以及Fibonacci数是否可以多次使用

斐波那契数定义为:

F1 = 1
F2 = 1
Fn = Fn-1 + Fn-2 , for n > 2.
可以保证,对于给定的约束,我们总是可以找到这样的斐波那契数,求和k

问题链接:

例如: 输入:k=7 产出:2 说明:斐波那契数是:1,1,2,3,5,8,13。。。 对于k=7,我们可以使用2+5=7


    class Solution {
        public int findMinFibonacciNumbers(int count) {
            PriorityQueue<Integer> num=new PriorityQueue<>(Collections.reverseOrder());
          
            int i1=1,i2=1;
            num.add(i1);
            num.add(i2);
            int k=count;
            int i3=0;
            k=k-2;
            int res=0;
            while(k>=1){
                i3=i2+i1;
                num.add(i3);
                int temp=i2;
                i2=i3;
                i1=temp;
                k--;
            }
            while(count!=0){
                int n=num.poll();
                if(n<=count)
                {      res++;
                       count-=n;
                }
            }
            return res;
            
        }
    }


类解决方案{
公共整数findMinficNumber(整数计数){
PriorityQueue num=新的PriorityQueue(Collections.reverseOrder());
inti1=1,i2=1;
num.add(i1);
num.add(i2);
int k=计数;
int i3=0;
k=k-2;
int res=0;
而(k>=1){
i3=i2+i1;
num.add(i3);
内部温度=i2;
i2=i3;
i1=温度;
k--;
}
while(计数!=0){
int n=num.poll();

如果(n您可以简单地使用递归来解决这个问题

这将通过:

class Solution {
    public int findMinFibonacciNumbers(int k) {
        if (k < 2)
            return k;

        int first = 1;
        int second = 1;

        while (second <= k) {
            second += first;
            first = second - first;
        }

        return 1 + findMinFibonacciNumbers(k - first);
    }
}
类解决方案{
公共int FINDMINFIN数字(int k){
if(k<2)
返回k;
int first=1;
int秒=1;

while(second)请阅读:您正在
轮询队列,从队列中删除元素,但您可能想使用
peek
一些简单的打印语句调试应该会显示问题。调试器可能更容易。