zoukankan      html  css  js  c++  java
  • 剑指Offer-9.变态跳台阶(C++/Java)

    题目:

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

    分析:

    假设我们要求跳上第3级的跳法,可以从第0级跳3级台阶到达,也可以从第1级跳2级台阶到达,还可以从第2级跳1级到达。

    所以跳上第3级的跳法数等于到达第0级的跳数加上到达第1级的跳数再加上到达第2级的跳数,也就是f(3) = f(2) + f(1) + f(0)

    可以推导出f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1) + f(0)

    我们还可以这样思考这个问题,从第0级跳到第n级需要经历n-1个台阶,因为青蛙可以跳1~n级青蛙跳上n级,青蛙跳法可以等价于台阶的选择,比如跳到3级时,青蛙先跳1级再跳两级,实际上就是青蛙从第0级先到达第1级台阶,再从第1级台阶跳到了第3级,而如果青蛙直接跳到了第3级,实际上就是没有使用台阶,所以青蛙的跳法等价于台阶的有无,跳到n级有n-1个台阶,每个台阶都存在使用或者不使用两个状态,所以最后的答案就是2^(n-1),或者是1<<(n-1)。

    程序:

    C++

    //dp
    class Solution {
    public:
        int jumpFloorII(int number) {
            if(number == 0) return 0;
            if(number == 1) return 1;
            vector<int> res(number+1, 0);
            res[0] = 1;
            res[1] = 1;
            for(int i = 2; i <= number; ++i){
                for(int j = 0; j < i; ++j)
                    res[i] += res[j];
            }
            return res[number];
        } 
    };

    Java

    public class Solution {
        public int JumpFloorII(int target) {
            return 1 << (target-1);
        }
    }
    /*import java.util.*;
    public class Solution {
        public int JumpFloorII(int target) {
            return (int)Math.pow(2, target-1);
        }
    }*/
  • 相关阅读:
    回首2016,展望2017
    认识多线程
    对CloseHandle用法的理解
    CDC、HDC、pDC之间的关系
    兼容位图和兼容DC的理解
    窗口中显示bmp图片的过程
    创建一个bmp格式的简单方法
    说明为什么Button控件不能使用CustomDraw技术
    MFC自绘Button按钮分析和实现
    VC之美化界面篇
  • 原文地址:https://www.cnblogs.com/silentteller/p/11853204.html
Copyright © 2011-2022 走看看