タイトル
https://leetcode-cn.com/problems/fibonacci-number/solution/fei-bo-na-qi-shu-by-leetcode/
アイデア
最初の方法は再帰を使用しますが、計算が繰り返されるため時間がかかりすぎます。f(n)を見つけるにはf(n-1)とf(n-2)だけが必要なので、mapを使用して中間変数を保存します。最初の2つの計算結果を保存してください
コード
public class N10FeiBoNaQiShuLieLco {
private static Map<Integer,Integer> map = new HashMap<>();
//使用递归实现
public static int fib(int n) {
if(n==0||n==1){
return n;
}else {
return fib(n-1)+fib(n-2);
}
}
//保存中间结果
public static int fib2(int n) {
if(n==0||n==1){
return n;
}
if(map.containsKey(n)) {
return map.get(n);
}
int sum = fib(n - 1) + fib(n - 2);
map.put(n, sum);
return sum;
}
//升级方法二 不用保存全部中间值 自底向上
// 要求f(n) 那我只要知道f(n-1) 和f(n-2)即可 所以从f(0)一直计算到f(n)即可
public static int fib3(int n){
if(n<=1){
return n;
}
int fibNminus1 = 1;
int fibNminus2 = 0;
int fibn = 0;
for (int i = 1; i < n; i++) {
fibn = fibNminus1+fibNminus2;
fibNminus2 = fibNminus1;
fibNminus1 = fibn;
}
return fibn;
}
public static void main(String[] args) {
System.out.println(fib3(3));
}
}
追記2つの驚き
1.剣のオファーに対する答えは間違っています。0から始まるはずです。他の人は正しいです。恥ずかしさを理解できませんでした。
2.Leetcodeの剣の指の提供の判断も間違っています。その前にLeetCodeでフィボナッチを使用する必要があります