剑指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 }

浙公网安备 33010602011771号