美文网首页
剑指 offer 笔记 08 | 跳台阶

剑指 offer 笔记 08 | 跳台阶

作者: ProudLin | 来源:发表于2019-04-30 13:46 被阅读0次

    题目描述

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

    题目分析:
    本题可以用递归和迭代来解答,那么就是要找规律了。因为青蛙只有 一次 1 阶或者 2 阶的跳法。

    递归法:

    1)当台阶为 1 时,只有一种跳法,一步到位。

    2)当台阶为 2 时,有两种,一种是分两次跳,每次为 1;第二种,跳一次,一次跳两级;

    3)从特殊推测到一般情况,假定第一次跳的是 1 阶,那么剩下的是 n-1 个台阶,跳法是 f(n-1);

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

    5)由 3)和 4)假设可以得出总跳法为: f(n) = f(n-1) + f(n-2) ;

    6)最终得出的是一个斐波那契数列:
    | 1, (n=1)
    f(n) = | 2, (n=2)
    | f(n-1)+f(n-2) ,(n>2,n为整数)

    额外补充:
    直接找规律,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以总结出f(n) = f(n-1) + f(n-2)的规律;

    假设现在 6 个台阶,我们可以从第 5 跳一步到 6,这样的话有多少种方案跳到 5 就有多少种方案跳到 6;

    另外我们也可以从 4 跳两步跳到 6,跳到 4 有多少种方案的话,就有多少种方案跳到 6,其他的不能从 3 跳到 6 什么的啦;

    所以最后就是 f(6) = f(5) + f(4);这样子也很好理解变态跳台阶的问题了。

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

    迭代法:

    public class Solution {
        public int JumpFloor(int target) {
            if(target <= 0) {
                return 0;
            }else if(target == 1) {
                return 1;
            }else  if(target == 2)  {
                return 2;
            }
            int one = 1;
            int two = 2;
            int result = 0;
            for(int i = 2; i < target; i++) {
                result = one+ two;
                one = two;
                two = result;
            }
            return result;
        }
    }
    

    参考文献:https://www.nowcoder.com/profile/214250/codeBookDetail?submissionId=1520111

    相关文章

      网友评论

          本文标题:剑指 offer 笔记 08 | 跳台阶

          本文链接:https://www.haomeiwen.com/subject/wsnmnqtx.html