前言
今天偶然看到群里有小伙伴在讨论这道算法题,说实话算法题写的确实有些少了近期,都在忙着搬砖,所以简单做个记录。
题:
在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯();当N=9时呢?
核心思路,拆解:
到达台阶 11时,有可能是通过走 1阶上来的 ;也可能是走2阶上来的;
所以统计出到达 台阶11,也就是统计出 到达10阶 + 到达9阶 的 方法总数。
那么到达10阶,同样 有可能是通过走 1阶上来的 ;也可能是走2阶上来的;
所以统计出到达 台阶10,也就是统计出 到达 9 阶 + 到达 8 阶 的 方法总数。
那么到达9阶,同样 有可能是通过走 1阶上来的 ;也可能是走2阶上来的;
所以统计出到达 台阶9,也就是统计出 到达 8 阶 + 到达 7 阶 的 方法总数。
一样以此类推......
那么到达3阶,同样 有可能是通过走 1阶上来的 ;也可能是走2阶上来的;
所以统计出到达 台阶3,也就是统计出 到达2 阶 + 到达 1 阶 的 方法总数。
而到达2阶,方法总数有两种, 分两次 1 台阶走 或者 一次走 2 台阶;
而到达1阶,方法总数有一种, 一次走 1 台阶;
代码解:
public class Test { public static void main(String[] args) { //解法1 Integer result1 = getMethodLoop(11); System.out.println(result1); //144 //解法2 Integer result2=getSumMethods(11); System.out.println(result2); //144 } public static int getMethodLoop(int sum){ if (sum==1 ){ return 1; }else if (sum==2){ return 2; }else { int m1=sum-1; int m2=sum-2; int result= getMethodLoop(m1)+getMethodLoop(m2); return result; } } private static Integer getSumMethods(int sum) { Map<String,Integer> map=new HashMap<>(); map.put("1",1); map.put("2",2); for (int i=3;i<=sum;i++){ Integer m1=i-1; Integer m2=i-2; Integer m1Value = map.get(String.valueOf(m1)) ; Integer m2Value = map.get(String.valueOf(m2)) ; map.put(String.valueOf(i),m1Value+m2Value); } System.out.println(map.toString()); return map.get(String.valueOf(sum)); //{11=144, 1=1, 2=2, 3=3, 4=5, 5=8, 6=13, 7=21, 8=34, 9=55, 10=89} } }