文章目录
问题1. 输入一个 n ,求出斐波那契数列中的第 n 个数。(0 <= n <= 39)
至于斐波那契数列就不多说了。
直接看代码吧
思路1:
利用递归求出第 n 个斐波那契数,并返回即可。
public class Solution{
public int Fibonacci(int n){
if(n == 0 || n ==1){
return n;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
思路2:
不用递归,用循环即可,把之前计算的数保存下来
public class Solution{
public int Fibonacci(int n){
if(n == 0 || n ==1){
return n;
}
int[] arr = new int[n + 1];
arr[0] = 0;
arr[1] = 1;
for(int i = 2; i <= n; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
}
思路3:
累加,指针
public class Solution{
public int Fibonacci(int n){
if(n == 0 || n ==1){
return n;
}
int pre = 1;
int last = 0;
int res = 0;
for(int i = 2; i <= n; i++){
res = pre + last;
last = pre;
pre = res;
}
return res;
}
}
思路4:
直接把整个数组创建好,需要哪个
public class Solution{
int[] arr = new int[40];
public Solution{
arr[0] = 0;
arr[1] = 1;
for(int i = 2; i < arr.length; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
}
public int Fibonacci(int n){
return arr[n];
}
}
问题2:矩形覆盖
问题描述:
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?注意这道题,覆盖成功的矩形的宽一定只能是 2,它的长 是 n
代码:
public class Solution{
public static int rectCover(int n){
if(n == 0){
return 0;
}
if(n == 1 || n == 2){
return n;
}
return rectCover(n - 1) + rectCover(n - 2);
}
}
问题3:跳台阶
问题描述:
有一只青蛙想要跳上 n 层的台阶,每次只能跳1层或者 2 层,问跳上 n 层台阶一共有多少种跳法
代码:
满足斐波那契数列,上述的四种方法都可以该问题,列出一种 递归的
public class Solution{
public int JumpFloor(int n){
if(n <= 2){
return n;
}
return JumpFloor(n - 1) + JumpFloor(n - 2);
}
}
跳台阶的拓展问题:变态跳台阶
问题描述:
青蛙要跳上 n 层的台阶,每次可以跳 1 层、2 层、3 层、……、n 层,问一共有多少种跳法
代码:
public class Solution{
public int JumpFloorII(int n){
if(n == 0){
return -1;
} else if(n <= 2){
return n;
} else {
return 2 * JumpFloorII(n - 1);
}
}
}