面试题 10:斐波那契数列
题目一:求斐波那契数列的第n项
题目描述
输入一个整数 n
,求斐波那契数列的第 n
项。
假定从 0
开始,第 0
项为 0
。( n <= 39
)
样例
输入整数 n=5
返回 5
斐波那契数列的定义如下:
f ( n ) = { 0 , n = 0 1 , n = 1 f ( n − 1 ) + f ( n − 2 ) , n > 1 f(n)=\begin{cases} 0, & n = 0 \\ 1, & n = 1 \\ f(n-1)+f(n-2), & n>1 \end{cases} f(n)=⎩⎪⎨⎪⎧0,1,f(n−1)+f(n−2),n=0n=1n>1
递归
class Solution {
public int Fibonacci(int n) {
if(n < 2)
return n;
return Fibonacci(n-1) + Fibonacci(n-2)
}
}
递归解法有严重的效率问题。
非递归(迭代)
class Solution {
public int Fibonacci(int n) {
if (n < 2)
return n;
int f0 = 0, f1 = 1;
int f2;
for (int i = 1; i < n; ++i) {
f2 = f1;
f1 = f0 + f1;
f0 = f2;
}
return f1;
}
}
题目二:跳台阶
题目描述
一只青蛙一次可以跳上 1
级台阶,也可以跳上 2
级。求该青蛙跳上一个 n
级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
public class Solution {
public int JumpFloor(int target) {
if(target <= 2)
return target;
int f1 = 1, f2 = 2;
for(int i = 3; i <= target; ++i){
int temp = f1 + f2;
f1 = f2;
f2 = temp;
}
return f2;
}
}
题目三:变态跳台阶
题目描述
一只青蛙一次可以跳上 1
级台阶,也可以跳上 2
级……它也可以跳上 n
级。求该青蛙跳上一个 n
级的台阶总共有多少种跳法。
状态枚举
对于第 n
级台阶,不管前面的台阶怎么跳,只关注最后一步是从哪一级台阶跳上来的。因为一次可以跳上 1 ~ n
级台阶,所以最后一步可能是从第 0 ~ n-1
级台阶跳上来的,利用加法公式计算即可。
public class Solution {
public int JumpFloorII(int n) {
if (n <= 0)
return 0;
else if (n <= 2)
return n;
int[] f = new int[n + 1];
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= n; ++i) {
for (int j = 0; j < i; ++j) {
f[i] += f[j];
}
}
return f[n];
}
}
题目四:矩形覆盖
题目描述
我们可以用 2 * 1
的小矩形横着或者竖着去覆盖更大的矩形。请问用 n
个 2 * 1
的小矩形无重叠地覆盖一个 2 * n
的大矩形,总共有多少种方法?
public class Solution {
public int RectCover(int n) {
if (n <= 0)
return 0;
else if (n <= 2)
return n;
int f1 = 1, f2 = 2;
for (int i = 3; i <= n; ++i) {
int temp = f1 + f2;
f1 = f2;
f2 = temp;
}
return f2;
}
}