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

 题目描述

一只青蛙一次可以跳上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 };

 

posted @ 2017-02-24 03:44  Strawberry丶  阅读(185)  评论(0编辑  收藏  举报