力扣刷题笔记day01--爬楼梯

题目:

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

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

解答:

递归法:递归地进行爬楼梯求解,遵循下式:

f{\small (n)}=\begin{cases} 1 & \text{ } n=1 \\ 2 & \text{ } n=2 \\ f(n-1)+f(n-2) & \text{ } n\ge 3 \end{cases}

该方法简单,但当n>3时会发生重复计算,时间复杂度较高。

递归+hashmap法:该法在递归法基础上引入hashmap存放求得的部分,后续使用时直接取出避免重复计算。该方法耗时较短,但空间复杂度还需进一步提高。

代码:

class Solution {
    private Map storemap = new HashMap<>();
    public int climbStairs(int n) {
        if(n == 1) return 1;
        if(n == 2) return 2;
        if(null != storemap.get(n)) 
            return storemap.get(n);
        else{
            int result = climbStairs(n-1) + climbStairs(n-2);
            storemap.put(n,result);
            return result;
        }
    }
}

循环累加法:根据该问题性质,可以通过自底向上逐步累加的方法计算爬楼梯方法。该法时间与空间复杂度均为最优。

力扣刷题笔记day01--爬楼梯_第1张图片

 

class Solution {
    public int climbStairs(int n) {
        if(n == 1) return 1;
        if(n == 2) return 2;
        int result = 0;
        int pre = 2;
        int prepre = 1;
        for(int x=3; x<=n; x++){
            result = pre + prepre;
            prepre = pre;
            pre = result;

        }
        return result;
    }
}

你可能感兴趣的:(leetcode,java)