动态规划之爬楼梯问题
题目如下:
假设你正在爬楼梯。需要 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]; } }
利用数组存储每次计算所需的两个子问题的结果,避免重复计算子问题的结果。