• 跳台阶



    一只青蛙一次可以跳上一级台阶,也可以跳上两级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)


    青蛙每次只有两种跳法:一阶或二阶,假定第一次跳的是一阶,那么剩下的是 n - 1 个台阶,总的跳法是 f(n - 1)

    假定第一次跳的是二阶,那么剩下的是 n - 2 个台阶,跳法是 f(n - 2)

    通过实际情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2

    可以发现最终得出的是一个斐波那契数列:

    public class Solution {
        public int JumpFloor(int target) {
            if(target <= 0) {
                return 0;
            }
            if (target == 1 || target == 2) {
                return target;
            }
            return JumpFloor(target - 1) + JumpFloor(target - 2);
        }
    }
    

    递归会影响效率,可以使用迭代

    public int JumpFloor(int target) {
    
        if(target == 1 || target == 2) {
            return target;
        }
    
        // 第一阶和第二阶考虑过了,初始当前台阶为第三阶,向后迭代
        // 思路:当前台阶的跳法总数 = 当前台阶后退一阶的台阶的跳法总数 + 当前台阶后退二阶的台阶的跳法总数
    
        // 当前台阶的跳法总数
        int jumpSum = 0;
    
        // 当前台阶后退一阶的台阶的跳法总数(初始值当前台阶是第三阶)
        int jumpSumBackStep1 = 2;
    
        // 当前台阶后退二阶的台阶的跳法总数(初始值当前台阶是第三阶)
        int jumpSumBackStep2 = 1;
    
        for(int i = 3; i <= target; i++) {
             // 这一次迭代的跳法总数
            jumpSum= jumpSumBackStep1 + jumpSumBackStep2;
            // 下一次迭代后退两阶,相当于这一次迭代后退一阶
            jumpSumBackStep2 = jumpSumBackStep1;
            // 下一次迭代后退一阶,相当于这一次迭代跳法总数
            jumpSumBackStep1 = jumpSum;                   
        }
        return jumpSum;
    }
    

  • 相关阅读:
    Win10使用VMware虚拟机安装ubuntu
    算法资源清单
    JAVA Synchronized (三) volatile 与 synchronized 的比较
    JAVA Synchronized (二)
    Java多线程:线程状态以及wait(), notify(), notifyAll()
    Java中断机制
    Java throw与throws
    Java(Android)线程池
    JAVA interrupte中断线程的真正用途
    Java 守护线程
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/13731956.html
Copyright © 2020-2023  润新知