方法一:递归
使用递归计算给定整数的斐波那契数。
效率最差但是最简单的方法,会重复计算,就不实现了。
方法二:记忆化自底向上的方法
方法三:自底向上进行迭代
方法四:矩阵求幂
public class Solution
{
/*
//数组 方法二:记忆化自底向上的方法
public int Fib(int N)
{
if(N < 2)
return N;
int[] resArray = new int[N + 1];
resArray[0] = 0;
resArray[1] = 1;
for(int i = 2; i <= N; i++)
{
resArray[i] = resArray[i - 1] + resArray[i - 2];
}
return resArray[N];
}
*/
/* 滑动变量 方法三:自底向上进行迭代
public int Fib(int N)
{
if(N < 2)
return N;
int pre = 1;
int prepre = 0;
int current = 0;
for(int i = 2; i <= N; i++)
{
current = pre + prepre;
prepre = pre;
pre = current;
}
return current;
}
*/
//方法四:矩阵求幂
public int Fib(int N)
{
if (N <= 1) {
return N;
}
int[,] A = new int[,]{{1, 1}, {1, 0}};
matrixPower(A, N-1);
return A[0,0];
}
void matrixPower(int[,] A, int N) {
if (N <= 1) {
return;
}
matrixPower(A, N/2);
multiply(A, A);
int[,] B = new int[,]{{1, 1}, {1, 0}};
if (N%2 != 0) {
multiply(A, B);
}
}
void multiply(int[,] A, int[,] B) {
int x = A[0,0] * B[0,0] + A[0,1] * B[1,0];
int y = A[0,0] * B[0,1] + A[0,1] * B[1,1];
int z = A[1,0] * B[0,0] + A[1,1] * B[1,0];
int w = A[1,0] * B[0,1] + A[1,1] * B[1,1];
A[0,0] = x;
A[0,1] = y;
A[1,0] = z;
A[1,1] = w;
}
}