JZ9 变态跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。
求该青蛙跳上一个n级的台阶总共有多少种跳法。
方法一:暴力方法
1.思路
设f[i] 表示 当前跳道第 i 个台阶的方法数。那么f[n]就是所求答案。
假设现在已经跳到了第 n 个台阶,那么前一步可以从哪些台阶到达呢?
如果上一步跳 1 步到达第 n 个台阶,说明上一步在第 n-1 个台阶。已知跳到第n-1个台阶的方法数为dp[n-1]
如果上一步跳 2 步到达第 n 个台阶,说明上一步在第 n-2 个台阶。已知跳到第n-2个台阶的方法数为dp[n-2]
。。。
如果上一步跳 n 步到达第 n 个台阶,说明上一步在第 0 个台阶。已知跳到 第0个台阶的方法数为dp[0]
那么总的方法数就是所有可能的和。也就是dp[n] = dp[n-1] + dp[n-2] + ... + dp[0]
显然初始条件dp[0] = dp[1] = 1
所以我们就可以先求dp[2],然后dp[3]...dp[n-1], 最后dp[n]
2.复杂度
时间复杂度:O(n^2)
空间复杂度:O(n)
3.代码
import java. util. * ;
public class Solution {
public int jumpFloorII ( int target) {
if ( target <= 2 )
return target;
int [ ] dp = new int [ target + 1 ] ;
Arrays . fill ( dp, 0 ) ;
dp[ 0 ] = 1 ;
for ( int i= 1 ; i<= target; i++ ) {
for ( int j= 0 ; j< i; j++ ) {
dp[ i] += dp[ j] ;
}
}
return dp[ target] ;
}
}
方法二:优化
1.思路
对于方法一中的:dp[n] = dp[n-1] + dp[n-2] + ... + dp[0]
那么dp[n-1] 为多少呢?
dp[n-1] = dp[n-2] + dp[n-3] + ... + dp[0]
所以一合并,dp[n] = 2*dp[n-1],初始条件dp[0] = dp[1] = 1
2.复杂度
时间复杂度:O(n)
空间复杂度:O(n)
3.代码
import java. util. * ;
public class Solution {
public int jumpFloorII ( int target) {
if ( target <= 2 )
return target;
int [ ] dp = new int [ target + 1 ] ;
Arrays . fill ( dp, 0 ) ;
dp[ 0 ] = dp[ 1 ] = 1 ;
for ( int i= 2 ; i<= target; i++ ) {
dp[ i] = dp[ i- 1 ] << 1 ;
}
return dp[ target] ;
}
}
方法三:
1.思路
继续分析
dp[0] = dp[1] = 1 = 2^0
dp[2] = 2 = 2^1
dp[3] = 4 = 2^2
dp[4] = 8 = 2^3
所以 dp[n] = 2^(n-1)
2.复杂度
时间复杂度:O(n)
空间复杂度:O(1)
3.代码
public class Solution {
public int jumpFloorII ( int target) {
return 1 << ( target- 1 ) ;
}
}