动态规划之爬楼梯问题

题目如下:

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

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

注意:给定 n 是一个正整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

假设,只有1个台阶,那么需要爬1步,只有1种方法。

假设,只有2个台阶,那么需要先爬1步再爬1步,或者爬2步,有2种方法。

假设,只有3个台阶,那么需要先爬1步再爬1步再爬1步,或者爬2步再爬1步或者爬1步再爬2步,有3种方法。

以此类推,最终可以找到规律,假设有N个台阶,那么最终结果等于爬N-1个台阶和N-2个台阶的方法总数。

(将一个复杂的问题,转移成另一种状态,划分为多个子问题)

题解:

动态规划+滚动数组

 

class Solution {
    public static int climbStairs(int n) {
        switch (n) {
            case 1 :
                return 1;
            case 2 :
                return 2;
        }
        int[] rollArr = {1, 2};
        for (int i = 3; i < n + 1; i++) {
            int res = rollArr[0] + rollArr[1];
            rollArr[0] = rollArr[1];
            rollArr[1] = res;
        }
        return rollArr[1];
    }
}

 

 利用数组存储每次计算所需的两个子问题的结果,避免重复计算子问题的结果。

 

 

posted @ 2020-07-09 13:28  无心大魔王  阅读(254)  评论(0编辑  收藏  举报