2022-3-6 剑指offer day24
题1:
JZ71 跳台阶扩展问题
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。
数据范围:1 \le n \le 201≤n≤20
进阶:空间复杂度 O(1)O(1) , 时间复杂度 O(1)O(1)
进阶:空间复杂度 O(1)O(1) , 时间复杂度 O(1)O(1)
1 public class Solution { 2 public int jumpFloorII(int target) { 3 int[] ans=new int[21]; 4 ans[0]=1; 5 for (int i=1;i<=target;i++) { 6 int sum=0; 7 for (int j=0;j<i;j++) { 8 sum+=ans[j]; 9 } 10 ans[i]=sum; 11 } 12 return ans[target]; 13 } 14 }
思路:f_n=f_0+f_1+...+f_n-1,动态规划。
题2:
JZ70 矩形覆盖
描述
我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法?
数据范围:0 \le n \le 38 \0≤n≤38
进阶:空间复杂度 O(1)\O(1) ,时间复杂度 O(n)\O(n)
进阶:空间复杂度 O(1)\O(1) ,时间复杂度 O(n)\O(n)
注意:约定 n == 0 时,输出 0
比如n=3时,2*3的矩形块有3种不同的覆盖方法(从同一个方向看):
输入描述:
2*1的小矩形的总个数n
返回值描述:
覆盖一个2*n的大矩形总共有多少种不同的方法(从同一个方向看)
1 public class Solution { 2 public int rectCover(int target) { 3 if (target==0) return 0; 4 if (target==1) return 1; 5 if (target==2) return 2; 6 int f1=1,f2=2; 7 int ans=0; 8 for (int i=3;i<=target;i++) { 9 ans=f1+f2; 10 f1=f2; 11 f2=ans; 12 } 13 return ans; 14 } 15 }
思路:动态规划,可以转化为f_n=f_n-1+f_n-2