zoukankan      html  css  js  c++  java
  • 跳台阶


    一只青蛙一次可以跳上一级台阶,也可以跳上两级。求该青蛙跳上一个 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;
    }
    

  • 相关阅读:
    游戏 黑白棋
    题解 P2472 【[SCOI2007]蜥蜴】
    题解 P1682 【过家家】
    题解 P3153 【[CQOI2009]跳舞】
    题解 P2763 【试题库问题】
    题解 P1345 【[USACO5.4]奶牛的电信Telecowmunication】
    网络流----最大流
    Tarjan缩点
    C#之抽象类
    C#之深复制学习案例
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/13731956.html
Copyright © 2011-2022 走看看