[剑指Offer] 9.变态跳台阶

来源:互联网 发布:以色列人工智能武器 编辑:程序博客网 时间:2024/05/29 07:36
 题目描述

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

【思路1】每个台阶都有跳与不跳两种可能性(最后一个台阶除外),最后一个台阶必须跳。所以共用2^(n-1)中情况。

1 class Solution {2 public:3     int jumpFloorII(int number) {4         return 1<<--number;5         //1左移number-1位,即2的number-1次幂6         //return pow(2, number - 1);7     }8 };

【思路2】

  关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:

  f(1) = 1

  f(2) = f(2-1) + f(2-2) 

  f(3) = f(3-1) + f(3-2) + f(3-3) 

  ...

  f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n) 

 由以上可以继续简化:

  f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)

  f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) = f(n-1) + f(n-1)

  可以得出:

  f(n) = 2*f(n-1)

 得出最终结论,在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:

             | 1       ,(n=0 ) 

  f(n) =     | 1       ,(n=1 )

             | 2*f(n-1),(n>=2)
 1 class Solution { 2 public: 3     int jumpFloorII(int number) { 4         int res[100] = {0}; 5         res[0] = 1; 6         res[1] = 2; 7         for(int i = 2;i < number;i ++) 8             res[i] = 2 * res[i - 1]; 9         return res[number - 1];10     }11 };

 

原创粉丝点击