跳台阶与变态跳台阶

第八题:跳台阶与变态跳台阶

 

1.跳台阶    

题目描述

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

 

解析:根据题意,我们可以举例说明并从中找到数学规律。列举出台阶数与跳法,可得出规律类似斐波那契数列。

当然我们也可以推导出来,前提是该青蛙只能有两种跳法,一次跳一个台阶,一次跳两个台阶,那么假设我们第一次跳1个台阶,那么剩下台阶的跳法为 f(n-1),如果我们第一次跳2个台阶,那么剩下台阶的跳法为f(n-2),当剩下2个台阶时,结果为f(2) = 2,当剩下1个台阶时,结果为f(1) = 1,结论为:

          | 1,(n=1)

f(n) =  | 2,(n=2)

          | f(n-1)+f(n-2),(n>2)

 

具体实现代码如下:

 public class Solution {  //最优解  
     public int Fibonacci(int n) {    
         if(n <= 2){  //代码的鲁棒性  
             return n;    
         }    
         int first = 1;    
         int second = 2;    
         int result = 0;    
         for(int i = 3;i < n+1;i++){    
             result = first + second;      
             first = second;      
             second = result;      
         }    
         return result;   
     }    
 }  

 

2.变态跳台阶

题目描述

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

 

解析:有n级台阶,第一步的跳法有n种,可以一次跳一级,跳二级.....跳n级

跳1级,剩下的n-1级跳法为:f(n-1)

跳2级,剩下的n-1级跳法为:f(n-2)

得出:f(n) = f(n-1)+f(n-2)+......+f(1);

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

所以:f(n) = 2f(n-1);

 

下面代码为递归解法和非递归解法

第三种是一个非常牛逼的解,借鉴其他人的解释为: 每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共用2^(n-1)中情况

 

具体实现代码如下:

/**
 *〈一句话功能简述〉
*〈变态跳台阶〉 */ public class JumpFloorII { /** * 功能描述:
*〈递归写法〉 */ public int method1(int target){ if (target <= 0){ return -1; } if (target == 1){ return 1; }else { return 2*method1(target - 1); } } /** * 功能描述:
*〈非递归写法〉 */ public int method2(int target){ int count = 1; while (--target > 0){ count *= 2; } return count; } /** * 功能描述:
*〈牛逼解法〉 */ public int method3(int target){ return 1 << --target; } }

 

NowCoder(Online Coding, Please Click)

你可能感兴趣的:(剑指offer)