题解 | #矩阵最长递增路径#
跳台阶
http://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4
package com.hhdd.dp;
/**
* 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
* <p>
* 数据范围:1 \leq n \leq 401≤n≤40
* 要求:时间复杂度:O(n)O(n) ,空间复杂度: O(1)O(1)
*
* @Author HuangLusong
* @Date 2022/4/1 20:58
*/
public class 跳台阶 {
/**
* 用递归做
* 当规模小到 2 范围即可返回
*
* @param target
* @return
*/
public int jumpFloor(int target) {
if (target <= 2) {
return target;
}
return jumpFloor(target - 1) + jumpFloor(target - 2);
}
/**
* 递归很多重复计算的地方,如f(5) = f(4) + f(1) = f(3) +f(1) +f(1) 也等于 f(3) +f(2)
* 其实f(3)就被重复计算了,完全可以存储起来
*
* @param target
* @return
*/
private int[] arr = new int[50];
/**
* 通过记忆搜索的方式优化时间效率
*
* @param target
* @return
*/
public int jumpFloor2(int target) {
if (target <= 2) {
return target;
}
if (arr[target] != 0) {
return arr[target];
}
arr[target] = jumpFloor2(target - 1) + jumpFloor2(target - 2);
return arr[target];
}
/**
* 通过dp解决,优化掉递归栈空间
* 有点像找规律,解法2的反过程
* 知道f(1) f(2)则可知道f(3)
* 知道f(3) f(2)则可知道f(4)
*
* @param target
* @return
*/
public int jumpFloor3(int target) {
arr[1] = 1;
arr[2] = 2;
for (int i = 3; i <= target; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[target];
}
public static void main(String[] args) {
跳台阶 demo = new 跳台阶();
long start = System.currentTimeMillis();
int i = demo.jumpFloor3(7);
long en = System.currentTimeMillis();
System.out.println(start - en);
System.out.println("i = " + i);
}
}
