本题参考以下文章:
点击进入该文章
该文章采用了三种解法
题目描述
解法:(仅仅展示解题类)
第1种:采用递归算法(算法时间复杂度高)
class chuli {
public int tiao(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
// n=1 的话只有一种方案 返回1
return 1;
}
if (n == 2) {
// n=2的话有两种方案(跳一节台阶活着二阶台阶)返回2
return 2;
}
// 递归调用
return tiao(n - 1) + tiao(n - 2);
}
}
第2种:采用递归算法+上备忘录缓存(算法时间复杂度进行降低)
class chuli{
public Map<Integer, Integer> temp = new HashMap<>();
public int tiao(int n){
if (n == 0) {
return 1;
}
if (n == 1) {
// n=1 的话有一种方案
return 1;
}
if (n == 2) {
// n=2的话有两种方案
return 2;
}
if(temp.containsKey(n)){//备忘录里面存在这个次数
return temp.get(n);
}else{//备忘录中不存在次数需要 先进行递归调用 后缓存到备忘录 然后进行取出
temp.put(n,tiao(n-1)+tiao(n-2));
return temp.get(n);
}
}
}
第3种:动态规划
这点熟练度不高 懂得较少
class chuli{
public int tiao(int n) {
if (n<= 1) {
return 1;
}
if (n == 2) {
return 2;
}
int a = 1;
int b = 2;
int temp = 0;
for (int i = 3; i <= n; i++) {
//大数取模 对一个大数质数取模得到的还是原来值
temp = (a + b)% 1000000007;
//temp=a+b
a = b;
b = temp;
}
return temp;
}
}
/*本解的思路为: 从1,2阶台阶向上分析。
因为第n阶台阶的跳法登陆第n-1和n-2阶台阶的跳法总和,所以我们通过递推得出结论。将每节台阶都进行向上记录然后最终得出第n阶台阶的总跳法数。
至此,我们需要保存两个数,即n-1和n-2。
然后根据这两个数推上去得到想要的台阶数。
*/
动态规划的特征:最优子结构、状态转移、边界、子调用重叠问题
动态规划的解题思路:核心:拆分子问题、记录重复记录减少计算量。
穷举分析 ->确定边界 ->找出规律 ->找出不同状态跳转的方法
总结
简单解题3种方法