07 斐波那契数列
🍒题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,
请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
斐波那契数列:0,1,1,2,3,5…F(n-2),F(n-1),F(n)=F(n-2)+F(n-1)
思路1:递归
时间复杂度:O(2^n)
空间复杂度:O(1)
public class Solution {
public int Fibonacci(int n) {
if(n <= 1)
{
return n;
}
else
return Fibonacci(n-1)+Fibonacci(n -2) ;
}
}
思路2:数组
时间复杂度:O(n)
空间复杂度:O(n)
public class Solution {
public int Fibonacci(int n) {
int array[] = new int[40];
array[0] = 0;
array[1] = 1;
for(int i = 2;i <= n;i++)
{
array[i] = array[i - 1] + array[i - 2];
}
return array[n];
}
}
思路3:数组
时间复杂度:O(n)
空间复杂度:O(1)
public class Solution {
public int Fibonacci(int n) {
if(n <= 1){
return n;
}
int sum = 0;
int one = 1;//one存储n-1的值
int two = 0;//two存储n-2的值
for(int i = 2;i <= n;i++)
{
sum = one + two;
two = one;
one = sum;
}
return sum;
}
}
08 跳台阶
🍒题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。
求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路:
假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2);
故总跳法为: f(n) = f(n-1) + f(n-2) 。
public class Solution {
public int JumpFloor(int target) {
if(target <= 0){
return -1;
}
else if(target == 1){
return 1;
}
else if(target == 2)
{
return 2;
}
else
return JumpFloor(target - 1)+JumpFloor(target -2);
}
}
09 变态跳台阶
🍒题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。
求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路 迭代
设n 级台阶有f(n)种跳法,根据最后一次跳台阶的数目可以分解为最后一次一级,则前面需要跳n-1n−1 级,有f(n-1)种跳法;最后一次跳两级,则前面需要跳n−2 级,有f(n-2)种跳法。以此类推 易知,
f(n) = f(n-1)+f(n-2)+f(n-3)+…+f(1)
f(n-1) = f(n-2)+f(n-3)+f(n-4)…+f(1)
f(n-1)代入f(n)得:
f(n) = 2f(n-1)
public class Solution {
public int JumpFloorII(int target) {
if(target <= 0){
return -1;
}
else if(target == 1)
{
return 1;
}
else
return 2* JumpFloorII(target - 1);
}
}
10 矩形覆盖
🍒题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路
两种大神想法
public class Solution {
public int RectCover(int target) {
if(target <= 2)
return target;
else {
return RectCover(target-1)+RectCover(target -2);
}
}
}