• 算法刷题——爬楼梯


    本题为 
    LeetCode第70题爬楼梯
    ,题目如下:

    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

     

     

     当剩下 1 个台阶的时候只有 1 种方法 

            1==>1

     当剩下 2 个台阶的时候只有 2 种方法 

            1==>1  或者 2

     当剩下 3 个台阶的时候只有 3 种方法 

            1==>1==>1 或者 1==>2 或者 2==>1

     当剩下 4 个台阶的时候只有 5 种方法 

            1==>1==>1==>1 || 1==>2==>1 || 1==>1==>2 || 2==>1==> || 2==>2

    .

    .

    .

    推到 可知 f(3)=f(2)+f(1)=2+1  f(4)=f(3)+f(2)=3+2  所以 可以推出

    f(n)=f(n-1)+f(n-2)

    方法一:递归 

    代码:

    1. public class ClimbStairs {
    2. public static void main(String[] args) {
    3. int step=ClimbMethods(5);
    4. System.out.println(step);
    5. int step2= ClimbMethods(10);
    6. System.out.println(step2);
    7. }
    8. public static int ClimbMethods(int n){
    9. if(n==2)return 2;
    10. if(n==1) return 1;
    11. return ClimbMethods(n-2)+ClimbMethods(n-1);
    12. }
    13. }

    但是 经过分析 我们 无论哪种方法 都会有重复的计算

    例如: 我们计算 6个台阶的时候

    f(6)=f(5)+f(4)                

    f(5)=f(3)+f(4)                                                  f(4)=f(3)+f(2)

    f(4)=f(3)+f(2) + f(3)=f(2)+f(1)                        f(3)=f(2)+f(1) + f(2)

    这里 f(3)  f(4) 多次重复计算 有损于计算时间 所以我们可以将我们计算过的值 存入Map集合当中 如果有过直接取值 如果没有再去计算存储

     

     

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. public class ClimbStairs {
    4. public static void main(String[] args) {
    5. int step=ClimbMethods(5);
    6. System.out.println(step);
    7. int step2= ClimbMethods(10);
    8. System.out.println(step2);
    9. }
    10. private static Map resultMap=new HashMap();
    11. public static int ClimbMethods(int n){
    12. if(n==2)return 2;
    13. if(n==1) return 1;
    14. if(resultMap.get(n)==null){
    15. int result=ClimbMethods(n-2)+ ClimbMethods(n-1);
    16. resultMap.put(n,result);
    17. return result;
    18. }else{
    19. System.out.println(resultMap);
    20. return resultMap.get(n);
    21. }
    22. }
    23. }

     方法二:循环

     由上图 可知

    f(6)=f(5)+f(4)                

    f(5)=f(3)+f(4)                                                  f(4)=f(3)+f(2)

    f(4)=f(3)+f(2) + f(3)=f(2)+f(1)                        f(3)=f(2)+f(1) + f(2)

     下一次开始 用的 是上一次的值 根据这条 我们可以写一个循环 

    思路:

    3个变量 pre=1 prepre=2 result=0

    pre 为 f(n-1)的值 prepre为 f(n-2)的值

    result 为最终结果

    循环 条件应为 n初始值为 3 每次+1 知道 和 最终台阶数 6相等为止

    结果 result 为 f(n-1)+f(n-2)= pre+prepre

    替换

    pre 为 prepre 值

    prepre值为 result

     

     

    1. public static int ClimbForMethods(int n){
    2. if(n==2)return 2;
    3. if(n==1) return 1;
    4. int pre=1;
    5. int prepre=2;
    6. int result=0;
    7. for(int i=3;i<=n;++i){
    8. result=pre+prepre;
    9. pre=prepre;
    10. prepre=result;
    11. }
    12. return result;
    13. }

     调用

     

  • 相关阅读:
    ChatGLM-6B+LangChain与训练及模型微调教程
    进程基本概念
    11. 一文快速学懂常用工具——网络工具(下)
    ChessGPT:免费好用的国际象棋对弈AI机器人
    配运基础数据缓存瘦身实践
    MySQL 数据库中 Insert 语句的锁机制
    Learn Prompt-ChatGPT基本功:Prompt
    linux-ubuntu-16.04 安装 java8、 firewalld、 mysql5.7、Redis 5.0.3、FastDFS、nginx1.18
    3D视觉到三维视觉之结构光
    JSP EL表达式的基本语法及运算符的优先级(一览表)
  • 原文地址:https://blog.csdn.net/qq_33839972/article/details/127801366