剑指Offer P74 题目一:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
public class Solution
{
public int Fibonacci(int n)
{ // 递归虽然代码简洁,但是效率低下,因为从上往下,存在大量重复计算
// 考虑从下往上,运用循环
int f0 = 0;
int f1 = 1;
if (n == 0)
return f0;
if (n == 1)
return f1;
int fNMinus1 = f1;
int fNMinus2 = f0;
int fN = 0;
for (int i = 2; i <= n; i++)
{
fN = fNMinus1 + fNMinus2;
fNMinus2 = fNMinus1;
fNMinus1 = fN;
}
return fN;
}
}
题目二:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
public class Solution {
public int JumpFloor(int target)
{ // 斐波那契数列的变形问题
int jump1 = 1;
int jump2 = 2;
if (target == 1)
return jump1;
if (target == 2)
return jump2;
int jumpNMinus1 = jump2;
int jumpNMinus2 = jump1;
int jumpN = 0;
for (int i = 3; i <= target; i++)
{
jumpN = jumpNMinus1 + jumpNMinus2;
jumpNMinus2 = jumpNMinus1;
jumpNMinus1 = jumpN;
}
return jumpN;
}
}
题目三:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
public class Solution {
public int JumpFloorII(int target)
{ // 数学归纳法得到fn = 2^(n-1)
// return (int)Math.pow(2, target-1);
return 1 << (target - 1);
}
}
题目四:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
public class Solution
{
public int RectCover(int target)
{ // 仍然是斐波那契数列
int rC1 = 1;
int rC2 = 2;
if (target == 1)
return rC1;
if (target == 2)
return rC2;
int rCN = 0;
for (int i = 3; i <= target; i++)
{
rCN = rC1 + rC2;
rC1 = rC2;
rC2 = rCN;
}
return rCN;
}
}