算法小抄-爬楼梯

144 阅读1分钟

题目

leetcode链接

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

class Solution {
    public int climbStairs(int n) {
        return climbStairs(n,new HashMap<Integer,Integer>());
    }

    public int climbStairs(int n, Map<Integer,Integer> map) {
        if(n==1){
            return 1;
        }

        if(n==2){
            return 2;
        }

        if(map.containsKey(n)){
            return map.get(n);
        }

        int r = climbStairs(n-2,map) + climbStairs(n-1,map);
        map.put(n,r);
        return r;
    }
}

进阶

题目改为:每次可以走1,2,3步,但如果本次走3步,下一次因为体力不支,不能走3步

package org.plumecache.samples.test;

public class T1 {

    public static void main(String[] args) {
        System.out.println(f(6, 0));
    }

    /**
     * @param n   当前台阶数量
     * @param tag 0:本次可以走3步,1:本次不可以走3步
     * @return
     */
    private static int f(int n, int tag) {
        if (n == 1 || n == 0) {
            return 1;
        }

        if (n == 2) {
            return 2;
        }

        //下一次不是3步,那本次可以走1,2,3步
        if (tag == 0) {
            return f(n - 3, 1) + f(n - 2, 0) + f(n - 1, 0);
        }

        //下一次是3步,那本次只能走1,2步
        return f(n - 1, 0) + f(n - 2, 0);
    }
}