文章目录
一、斐波那契数列(非递归版)
1.题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
2.思路
斐波那契数列的特征
F(n) = F(n-1) + F(n-2)
3.代码
非递归版
public class Solution {
public int Fibonacci(int n) {
if(n<2){return n;} //前两项较特殊,单独考虑
int pre = 1; //前值
int prePre = 0; //前前值
int result = 0; //最后结果
for(int i=1;i<n;i++){ //说明n>=2,那么i从1开始
result = pre + prePre;
prePre = pre;
pre = result;
}
return result;
}
}
二、跳台阶(斐波那契数列的递归版)
1.题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
2.思路
由题意,青蛙若想跳到第n级。只能从第n-1或第n-2级台阶跳上来。
因此满足斐波那契数列的特征:
F(n) = F(n-1) + F(n-2)
3.代码
public class Solution {
public int JumpFloor(int target) {
int res = 0;
if(target == 1)
return 1;
else if(target == 2)
return 2;
else
res = JumpFloor(target-1) + JumpFloor(target-2);
return res;
}
}

哈哈哈,递归版的效率果然不行。毕竟要不停压栈嘛。
三、变态跳台阶
1.题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
2.思路
(1)第二题的思路
由题意,青蛙若想跳到第n级。能从第n-1或第n-2级或…第1级台阶跳上来。
故满足表达式
F(n) = F(n-1) + F(n-2) + F(n-3)....+ F(2) + F(1)
(2)简化
每个台阶可以看作一块木板,让青蛙跳上去,n个台阶就有n块木板,最后一块木板是青蛙到达的位子, 必须存在,其他 (n-1) 块木板可以任意选择是否存在,则每个木板有存在和不存在两种选择,(n-1) 块木板 就有 [2^(n-1)] 种跳法,可以直接得到结果。
所要求的序列为:0,1,2,4,8,16,……
所以除了第一位外,其他位的数都是前一位的数去乘以2所得到的积。
1<<n和2n等价
3.代码
(1)第二题的思路
public class Solution {
public int JumpFloorII(int target) {
if(target < 2){return target;} //特殊情况
int result = 1; //这一次代表直接从0跳到第n级台阶
while(target>0){
result += JumpFloorII(--target);
}
//boolean temp = ((target>=0) && (result+=JumpFloorII(target-1))>0);
return result;
}
}
(2)简化
public class Solution {
public int JumpFloorII(int target) {
if(target == 0){return 0;}
return 1<<--target; //1<<n和2^n^等价
}
}
四、矩形覆盖
1.题目
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
2.思路

因此满足斐波那契数列的特征:
F(n) = F(n-1) + F(n-2)
3.代码
public class Solution {
public int RectCover(int target) {
if(target < 3){return target;}
int result = 0;
result = RectCover(target-1) + RectCover(target-2);
return result;
}
}
4.拓展到用2*m的矩形覆盖
相应的结论:
(1)1 * 3方块 覆 盖3*n区域:f(n) = f(n-1) + f(n - 3), (n > 3)
(2) 1 *4 方块 覆 盖4*n区域:f(n) = f(n-1) + f(n - 4),(n > 4)
更一般的结论,如果用1*m的方块覆盖m*n区域,递推关系式为f(n) = f(n-1) + f(n-m),(n > m)。

300

被折叠的 条评论
为什么被折叠?



