剑指offer_变态傻逼跳台阶

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

喜闻乐见的递归算法是。

n=1,是1,n=2,结果是2。

然后可以用递归公式

当n = n 时,第一次跳出一阶后,后面还有f(n-1)中跳法; 第一次跳出二阶后,后面还有f(n-2)中跳法......第一次跳出n阶后,后面还有 f(n-n)中跳法,即:
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-n) 
 
 1 public class Solution {
 2     public int JumpFloorII(int n) {
 3         
 4         if(n<=2) return n;
 5         int sum=0;
 6         for(int i=1;i<=n;i++){
 7             sum+=JumpFloorII(n-i);
 8         }
 9         return sum+1;
10     }
11 }

问题不大,另外可以进行简单的推导简化公式

f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-n) = f(0) + f(1) + f(2) + ... + f(n-1)
又因为 f(n-1) = f(0) + f(2) + f(3) + ... + f(n-2)
两式相减得:f(n) = 2 * f(n-1)    ( n >= 2)
 1 public class Solution {
 2     public int JumpFloorII(int n) {
 3         
 4          if(n <= 0)
 5             return 0;
 6          if(n == 1)
 7             return 1;
 8          int f = 1;
 9          for(int i = 2; i <= n; i++)
10             {
11                 f = 2 * f;
12             }
13             return f;
14     }
15 }

另外可以更简化

发现f(n) 是一个等比数列

1 public class Solution {
2     public int JumpFloorII(int n) {
3          return (int) Math.pow(2, n - 1);
4     }
5 }

另外,可以用动态规划

1 public int JumpFloorII(int target) {
2 int[] dp = new int[target];
3 Arrays.fill(dp, 1);
4 for (int i = 1; i < target; i++)
5 for (int j = 0; j < i; j++)
6 dp[i] += dp[j];
7 return dp[target - 1];
8 }

 

posted @ 2019-08-13 09:41  chyblogs  阅读(139)  评论(0)    收藏  举报