每日算法之跳台阶扩展问题

JZ71跳台阶扩展问题

描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。

数据范围:1 \le n \le 201≤n≤20
进阶:空间复杂度 O(1)O(1) , 时间复杂度 O(1)O(1)

方法1 动态规划

思路:

对于最后一级台阶,我们可以由倒数第二级台阶跳1步,也可以由倒数第三级太极跳两步,即f(n)=f(n−1)+f(n−2)+...+f(n−(n−1))+f(n−n)=f(0)+f(1)+f(2)+...+f(n−1)f(n)=f(n-1)+f(n-2)+...+f(n-(n-1))+f(n-n)=f(0)+f(1)+f(2)+...+f(n-1)f(n)=f(n−1)+f(n−2)+...+f(n−(n−1))+f(n−n)=f(0)+f(1)+f(2)+...+f(n−1),因为f(n−1)=f(n−2)+f(n−3)+...+f((n−1)−(n−2))+f((n−1)−(n−1))f(n-1)=f(n-2)+f(n-3)+...+f((n-1)-(n-2))+f((n-1)-(n-1))f(n−1)=f(n−2)+f(n−3)+...+f((n−1)−(n−2))+f((n−1)−(n−1)),经整理得f(n)=f(n−1)+f(n−1)=2∗f(n−1)f(n)=f(n-1)+f(n-1)=2*f(n-1)f(n)=f(n−1)+f(n−1)=2∗f(n−1),因此每级台阶方案数是前面一级台阶方案数的2倍。

代码

int[] bp = new int[target + 1];
        bp[0] = 1;
        bp[1] = 1;
        for (int i = 2; i <= target; i++) {
            bp[i] = 2 * bp[i - 1];
        }
        return bp[target];

方法2 递归

代码

package esay.JZ71跳台阶扩展问题;

public class Solution {
    public int jumpFloorII(int target) {
        //方法1:动态规划
        /*int[] bp = new int[target + 1];
        bp[0] = 1;
        bp[1] = 1;
        for (int i = 2; i <= target; i++) {
            bp[i] = 2 * bp[i - 1];
        }
        return bp[target];*/

        //方法2:递归
        if (target <= 1) return 1;
        return 2 * jumpFloorII(target - 1);
    }
}


网页名称:每日算法之跳台阶扩展问题
链接URL:http://bzwzjz.com/article/dsdihid.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 重庆网站建设 营销网站建设 响应式网站设计 成都网站设计 网站建设 成都网站建设 攀枝花网站设计 高端网站设计 上市集团网站建设 手机网站建设套餐 app网站建设 成都做网站建设公司 营销型网站建设 成都企业网站制作 网站设计公司 宜宾网站设计 企业网站设计 成都网站设计公司 成都网站建设 成都网站建设 营销型网站建设 外贸网站建设