码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • LeetCode高频题70. 爬楼梯,青蛙跳台阶,暴力递归的尝试,改记忆化搜索和动态规划代码


    LeetCode高频题70. 爬楼梯,青蛙跳台阶,暴力递归的尝试,改记忆化搜索和动态规划代码

    提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
    互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
    你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
    在这里插入图片描述
    基础知识:
    (3)斐波那契数列:暴力递归改动态规划
    (4)用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快
    (5)类似斐波那契数列:奶牛生牛问题:奶牛生下来3年可以成熟生小牛,请问第N年一共多少牛
    (6)人或者青蛙走台阶,每次它可以一步走1阶,或2阶,请问总共n层能有多少种走法
    (7)一个N位字符串s,只包含0和1的,要求每个0左边都是1才达标,请问01组合出s有多少种组合方法
    【8】一个2N的表格,砖块是12的尺寸,可以横着放或竖着放,请问2*N列表格有多少种放法?


    文章目录

    • LeetCode高频题70. 爬楼梯,青蛙跳台阶,暴力递归的尝试,改记忆化搜索和动态规划代码
      • @[TOC](文章目录)
    • 题目
    • 一、审题
    • 关键在暴力递归的尝试
    • 之所以设计算法题,就是希望你别太暴力,而是有优化算法的能力,咱们改记忆化搜索代码或者动态规划代码
    • 总结

    题目

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

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


    一、审题

    示例 1:

    n=1
    就一种:1

    输入:n = 2
    输出:2
    解释:有两种方法可以爬到楼顶。

    1. 1 阶 + 1 阶
    2. 2 阶

    示例 2:

    输入:n = 3
    输出:3
    解释:有三种方法可以爬到楼顶。
    4. 1 阶 + 1 阶 + 1 阶
    5. 1 阶 + 2 阶
    6. 2 阶 + 1 阶

    提示:

    1 <= n <= 45

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/climbing-stairs
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    关键在暴力递归的尝试

    在这里插入图片描述
    不妨设f(n)是台阶有n阶,从1–n阶跳法有多少种?

    你在n阶处
    请问你是n-1那迈1阶来的?【那f(n-1)就是我们的跳法数量】
    或者你是n-2那迈2阶来的?【那f(n-2)就是我们的跳法数量】

    因为题目说了只能跳1阶,或者2阶
    你从1—n不管咋跳,完整走完n阶算一种跳法

    因此这就是一个简单的递归推理式子
    f(n)=f(n-1)+f(n-2)

    当然了,笔试我们用这个函数编写代码是无法通过的,速度太慢

    咱们先完成这个代码:

            //f(n)=f(n-1)+f(n-2)
            //f=climbStairsReview
            public int climbStairsReview(int n) {
                if (n == 1) return 1;
                if (n == 2) return 2;
    
                return climbStairsReview(n - 1) + climbStairsReview(n - 2);
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试结果:

        public static void test(){
            Solution solution = new Solution();
            System.out.println(solution.climbStairs(4));
            System.out.println(solution.climbStairsReview(4));
        }
    
        public static void main(String[] args) {
            test();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    5
    5
    
    
    • 1
    • 2
    • 3

    之所以设计算法题,就是希望你别太暴力,而是有优化算法的能力,咱们改记忆化搜索代码或者动态规划代码

    显然一个n一定对应一个结果
    f有一个依赖方程
    就是动态规划的转移方程呗

    因此用dp[n]记录n阶时,你的跳法有多少种?
    dp是一个1维长度是n+1的表格,n=0我们不用

    因为f=fn-1+fn-2,所以根据这个方程,我们就知道dp[n]是dpn-1+dpn-2了
    很简单
    在这里插入图片描述

    手撕代码:

            public int climbStairsReviewDP(int n) {
                if (n == 1) return 1;
                if (n == 2) return 2;
                int[] dp = new int[n + 1];
                dp[1] = 1;
                dp[2] = 2;
    
                for (int i = 3; i <= n; i++) {
                    dp[i] = dp[i - 1] + dp[i - 2];//暴力递归改来的
                }
    
                return dp[n];//结果
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这就用空间dp
    换的了时间
    加速了算法

    测试:

        public static void test(){
            Solution solution = new Solution();
            System.out.println(solution.climbStairs(4));
            System.out.println(solution.climbStairsReview(4));
            System.out.println(solution.climbStairsReviewDP(4));
        }
    
        public static void main(String[] args) {
            test();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    5
    5
    5
    
    • 1
    • 2
    • 3

    LeetCode测试:
    在这里插入图片描述
    在这里插入图片描述
    算法考你就是想让你优化代码
    就是这个意思

    后来大量的公司,就改变这个题目为青蛙跳台阶问题,
    换了名字,函数,代码没有变动

    包括你说还能一步跳3阶呢???
    那不就是f=fn-1+fn-2+fn-3
    这不就是多了一种跳法??不难的

    类似的关于斐波那契数列的问题,多得很
    我都说过:
    (3)斐波那契数列:暴力递归改动态规划
    (4)用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快
    (5)类似斐波那契数列:奶牛生牛问题:奶牛生下来3年可以成熟生小牛,请问第N年一共多少牛
    (6)人或者青蛙走台阶,每次它可以一步走1阶,或2阶,请问总共n层能有多少种走法
    (7)一个N位字符串s,只包含0和1的,要求每个0左边都是1才达标,请问01组合出s有多少种组合方法
    【8】一个2N的表格,砖块是12的尺寸,可以横着放或竖着放,请问2*N列表格有多少种放法?


    总结

    提示:重要经验:

    1)斐波那契数列,和类似斐波那契数列,都是通过简单的递归函数,改为动态规划的
    2)这题经常出现在各大厂笔试面试中,很简单很简单
    3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

  • 相关阅读:
    MySQL之数据查询(分类汇总与排序)
    如何从一款单片机移植到另一款单片机
    【OS】操作系统高频面试题英文版(1)
    MFC Windows 程序设计[243]之托盘弹泡泡(附源码)
    DBT 项目建立
    VS2022 性能提升:更快的 C++ 代码索引
    Docker、Linux、Jenkins
    【网络协议】Https
    算法之斐波那契数列
    【iOS开发】-通知传值
  • 原文地址:https://blog.csdn.net/weixin_46838716/article/details/126170871
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号