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