跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
我的想法
- 本题是上一题的升级版,青蛙的跳的方式不再局限于2种,而是n种,依然将n级台阶的跳法总数记为f(n)。
- 既然青蛙有n种跳的方式,可以将问题转换一下:除了最后一个台阶青蛙必须选择到达,其他台阶青蛙都可以选择去或者不去那一阶台阶。
- 比如,台阶数为1,青蛙必须选择到达,跳法只有1种。
台阶数为2,第一阶台阶青蛙可以选择去或者不去,有2种选择,第二结是最后一阶,必须去,跳法为2 * 1。
台阶数为3,第一阶台阶可已选择去或者不去,第二个台阶可以选择去或者不去,第三个台阶必须去,跳法有2 * 2 * 1种。 - 依次类推,跳法总数实际上是这么一个数列,1,2 * 1,2 * 2 * 1,2 * 2 * 2 * 1…
- 总结起来,f(n) = f(n-1) * 2, n > 1。
解题方法1
//找到规律迅速解题,递归求解,这里没有重复计算哦
public static int JumpFloorII(int target) {
if (target <= 0) {
return -1;
} else if (target == 1) {
return 1;
} else {
return 2 * JumpFloorII(target - 1);
}
}
代码测试
package com.learnjiawa.jzoffer;
import com.newcoder.algorithm.dac.Hanoitower;
/**
* @author learnjiawa
* 2019-12-08-10:12
*/
public class Solution9 {
public static void main(String[] args) {
int target = 8;
System.out.println(target+"阶台阶一共有"+JumpFloorII(target)+"种跳法");
}
public static int JumpFloorII(int target) {
if (target <= 0) {
return -1;
} else if (target == 1) {
return 1;
} else {
return 2 * JumpFloorII(target - 1);
}
}
}
测试代码控制台输出:
总结
题目主要考察递归和循环的相关知识点,找到规律迅速解题。
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava: