leetcode70爬楼梯

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

复制代码
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

复制代码
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

思路:

n=1时,f(n)=1;

n=2时,f(n)=2;

n>2时,f(n)=f(n -1)+f(n -2)


解决:

解法1:递归

java 复制代码
public int climbStairs(int n) {
        if(n==1) return 1;
        if(n==2) return 2;
        return climbStairs(n-1)+climbStairs(n-2);
    }

这种解法时间复杂度高,为O(n^2),提交会显示超出时间限制。


解法2:递归,用HashMap存储中间结果

java 复制代码
private Map<Integer,Integer> storeMap = new HashMap();
public int climbStairs(int n) {
    if(n==1) return 1;
    if(n==2) return 2;
    if(null != storeMap.get(n))
        return storeMap.get(n);
    else {
        int result=climbStairs(n-1)+climbStairs(n-2);
        storeMap.put(n,result);
        return result;
        }
}

使用hashmap保存已经求出的f(n)值,下次求解时先在hashmap中找看之前有没有求过。这样就可以避免重复计算。时间复杂度为O(n)。


解法3:迭代循环

java 复制代码
public int climbStairs(int n) {
        if(n==1) return 1;
        if(n==2) return 2;
        int result=0;
        int pre=2;
        int prepre=1;
        for(int i=3;i<=n;i++) {
            result=pre+prepre;
            prepre=pre;
            pre=result;
        }
        return result;
    }

由底向上,从f(2)和f(1)累加向上,f(3)=f(2)+f(1),f(4)=f(3)+f(2),求f(3)需要知道f(2)和f(1),求f(4)需要知道f(3)和f(2),则需要两个额外变量保存每轮的子问题的解。时间复杂度为O(n)。


加油加油^_^

相关推荐
微笑尅乐8 分钟前
BFS 与 DFS——力扣102.二叉树的层序遍历
leetcode·深度优先·宽度优先
懒羊羊不懒@17 分钟前
Java基础语法—最小单位、及注释
java·c语言·开发语言·数据结构·学习·算法
ss27321 分钟前
手写Spring第4弹: Spring框架进化论:15年技术变迁:从XML配置到响应式编程的演进之路
xml·java·开发语言·后端·spring
DokiDoki之父32 分钟前
MyBatis—增删查改操作
java·spring boot·mybatis
兩尛1 小时前
Spring面试
java·spring·面试
Java中文社群1 小时前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme1 小时前
java.nio 包详解
java·python·nio
零千叶1 小时前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
白云千载尽2 小时前
leetcode 912.排序数组
算法·leetcode·职场和发展
哆啦刘小洋2 小时前
Tips:预封装约束的状态定义
算法