版权声明:本文自由转载,转载请注明出处。 https://blog.csdn.net/qq_38071429/article/details/83823109
这两道题 其实相同。
public class Solution {
/*
一看到题目就想到用递归,结果虽然能通过,但时间还是太长
*/
public int Fibonacci(int target) {
return hhh(target);
}
int hhh(int n){
if(n==1||n==2) return 1;
if(n==0) return 0; //牛客网提交没有这一句提示stackoverflow
return hhh(n-2)+hhh(n-1);
}
}
public class Solution {
/*
仔细看题目,已经给出了n的极限是39,可以直接定义一个数组存储0-39的所有斐波那契数
*/
public int Fibonacci(int target) {
int arr[] = new int[40];
arr[0] = 0;
arr[1] = 1;
//习惯从两个1开始的斐波那契数,在这里直接赋值也减少了下面的一次循环,for的i从3开始
arr[2] = 1;
for(int i=3;i<=39;i++){
arr[i] = arr[i-1] + arr[i-2];
}
return arr[target];
}
}
public class Solution {
public int Fibonacci(int target) {
int arr[] = new int[40];
arr[0] = 0;
arr[1] = 1;
//同上 多一次循环时间就长一些
for(int i=2;i<=39;i++){
arr[i] = arr[i-1] + arr[i-2];
}
return arr[target];
}
}
public class Solution {
/*
尾递归 时空间最优!
*/
public int Fibonacci(int target) {
return hhh(0,1,target);
}
int hhh(int x,int y,int z){
if(z==0) return 0;
if(z==1) return y;
// 斐波那契数只需要知道当前位置前面的两个数即可相加得出当前的数值
// 所以我们把前两个数值加入递归条件 避免了n!的复杂度
return hhh(y ,x+y ,z-1);
}
}
这道题说来惭愧,本人没有做出来。。不过一旦知道了解题思路一辈子都不会忘,方法也很简单。
简单地说 这就是一道数学题
青蛙在n-1级台阶上 都可以选择跳与不跳 最后一级n阶一定要跳 运用排列组合的知识 我们可以得到这么一条公式:
f(n)= 2^(n-1)* 1
是不是完美?!有了这么一条公式之后代码就完全呼之欲出了。。
在这里介绍一下效率高的位移(这里是左移)运算符来计算2的次方:<< ,拾人牙慧的代码如下:
public class Solution {
public int JumpFloorII(int target) {
return 1<<(target-1); //1*(2^(target-1))
}
}
2*1的小矩形可以横着或者竖着铺:
n=0或1:1种铺法;
n=2:2种铺法,两块横着或者两块竖着铺;
n=3:3种铺法;1+2
n=4:5种铺法;2+3
......
n=n:f(n)= f(n-1)+ f(n-2)
public class Solution {
public int RectCover(int target) {
return hhh(1,2,target);
}
int hhh(int x,int y,int z){
if(z==0) return 0;
if(z==1) return 1;
if(z==2) return y;
return hhh(y ,x+y ,z-1);
}
}