斐波那契 :
Java:
法一:递归是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。
public class Solution {
public int Fibonacci(int n) {
int []ans=new int[40];
ans[1]=1;
for(int i=2;i<=n;i++){
ans[i]=ans[i-1]+ans[i-2];
}
return ans[n];
}
}
时间复杂度:O(n)
空间复杂度:O(n)
法二:考虑到第 i 项只与第 i-1 和第 i-2 项有关,因此只需要存储前两项的值就能求解第 i 项,从而将空间复杂度由 O(N) 降低为 O(1)
public class Solution {
public int Fibonacci(int n) {
int a=0,b=1,sum=0;
if(n<=1) return n;
for(int i=2;i<=n;i++){
sum=a+b;
a=b;
b=sum;
}
return sum;
}
}
矩形覆盖:
解题思路:
Java:
public class Solution {
public int RectCover(int target) {
int a=1,b=2,sum=0;
if(target<=2) return target;
for(int i=3;i<=target;i++){
sum=a+b;
a=b;
b=sum;
}
return sum;
}
}
跳台阶:
解题思路:
public class Solution {
public int JumpFloor(int target) {
int a=1,b=2,sum=0;
if(target<=2) return target;
for(int i=3;i<=target;i++){
sum=a+b;
a=b;
b=sum;
}
return sum;
}
}
变态跳台阶:
Java:
public class Solution {
public int JumpFloorII(int target) {
return (int)Math.pow(2, target - 1);
}
}