1. 跳台阶
1.1 题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
1.2 示例1
输入
1
返回值
1
1.3 示例2
输入
4
返回值
5
1.4 核心代码实现
public class Solution {
public int JumpFloor(int target) {
/*递归:时间复杂度太大
if(target <= 1) return 1;
return JumpFloor(target - 1) + JumpFloor(target - 2);
*/
/*设置新变量
if(target <= 1) return target;
int a = 1, b = 1, counts = 0;
for(int i = 2; i <= target; i++){
counts = a + b;
a = b;
b = counts;
}
return counts;
*/
//开辟新空间
int[] arr = new int[target + 1];
arr[0] = arr[1] = 1;
for(int i = 2; i <= target; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[target];
}
}
2. 变态跳台阶
2.1 题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
2.2 示例1
输入
3
返回值
4
2.3 核心代码实现
public class Solution {
public int JumpFloorII(int target) {
if(target <= 1) return target;
int jumpWayII = 1;
for(int i = 2; i <= target; i++){
jumpWayII = 2 * jumpWayII;
}
return jumpWayII;
}
}
3. 矩形覆盖
3.1 题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?比如n=3时,23的矩形块有3种覆盖方法:
3.2 示例1
输入
4
返回值
5
3.3 核心代码实现
public class Solution {
public int rectCover(int target) {
/*递归
if(target <= 2) return target;
return rectCover(target - 1) + rectCover(target - 2);
*/
/*借助变量
if(target <= 1) return target;
int a = 1, b = 1, counts = 0;
for(int i = 2; i <= target; i++){
counts = a + b;
a = b;
b = counts;
}
return counts;
*/
//借助数组
if(target <= 1) return target;
int[] arr = new int[target + 1];
arr[0] = arr[1] = 1;
for(int i = 2; i < arr.length; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[target];
}
}