形如: 1 1 2 3 5 8 13 21 34 ...
即为斐波那契数列,自己今天图图画画写了三种方法。
迭代法
class Solution {
public:
int fib(int n) {
if(n < 2) return n;
int a = 0, b = 1;
int sum;
for(int i = 2; i <= n; i++){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return sum;
}
};
数组法
class Solution {
public:
int Fibonacci(int n) {
if(n < 2) return n;
vector<int> ivec(n);
ivec[0] = 1;
ivec[1] = 1;
for(int i = 2; i < n; i++){
ivec[i] = ivec[i-1] + ivec[i-2];
}
return ivec[n-1];
}
};
递归法
class Solution {
public:
int Fibonacci(int n) {
if(n == 0) return 0;
if(n == 1 || n == 2) return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
};
改进,避免重复计算
class Solution {
public:
int fib(int n) {
if(n < 2) return n;
unordered_map<int, int> umap;
return fib(umap, n);
}
private:
int fib(unordered_map<int, int>& umap, int n){ // 记忆化递归
if(n < 2) return n;
if(umap.find(n) != umap.end()) return umap[n];
int f1 = fib(umap, n - 1) % 1000000007;
umap[n - 1] = f1;
int f2 = fib(umap, n - 2) % 1000000007;
umap[n - 2] = f2;
int res = (f1 + f2) % 1000000007;
umap[n] = res;
return res;
}
};