题目描述 提示:
-
1
<
=
k
<
=
1
0
9
1 <= k <= 10^9
1<=k<=109
贪心
思路:🤔
- 先枚举出 [1, k] 内所有的斐波那契数;
- 然后,找到“最接近 k的斐波那契数”(即,下标为
fabo.size() - 1 对应的数,下标记作 index); - 从 index开始,从后向前 贪心枚举每个数:
- 如果当前斐波那契数 cnt > k,则需要将 index 向前移动,直至 cnt <= k;
- 否则,需要增加一个步数
res++; (注意:此时 index暂时不变 -> 因为题目说了每个斐波那契数可以重复使用)
class Solution {
public int findMinFibonacciNumbers(int k) {
List<Integer> fabo = getFabo(k);
System.out.println(fabo);
int res = 0;
int index = -1;
index = fabo.size() - 1;
System.out.println("index = " + index);
while (k > 0) {
while (index > 0 && k < fabo.get(index)) index--;
k -= fabo.get(index);
res++;
}
return res;
}
public List<Integer> getFabo(int k) {
List<Integer> fabo = new ArrayList<>();
fabo.add(1);
fabo.add(1);
int i = 2;
while (0L + fabo.get(i - 1) + fabo.get(i - 2) <= k) {
int cnt = fabo.get(i - 1) + fabo.get(i - 2);
fabo.add(cnt);
i++;
}
return fabo;
}
}
|