手撕一道算法题 在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯();当N=9时呢?

前言

今天偶然看到群里有小伙伴在讨论这道算法题,说实话算法题写的确实有些少了近期,都在忙着搬砖,所以简单做个记录。

题:

在你面前有一个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}
    }





}


 

猜你喜欢

转载自blog.csdn.net/qq_35387940/article/details/107844855