leetCode 070 爬楼梯
题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例输入输出:
输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶
思路:
利用数组进行动态规划
第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法,已经知道了第1个和第2个台阶的走法,一路加上去。
参数:
- 辅助数组
终止条件:
- cur为null
迭代过程中做的事:
-
复杂度分析:
- 时间复杂度:只需要遍历一遍,O(n)
- 空间复杂度:O(n)
代码:
/*第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法,已经知道了第1个和第2个台阶的走法,一路加上去。*/class Solution {public int climbStairs(int n) {if(n < 2){return n;}int[] f = new int[n+1];f[1] = 1;f[2] = 2;for(int i = 3; i <= n; i++){f[i] = f[i-1] + f[i-2];}return f[n];}}
动态规划空间优化
已知对于任意三个元素,第三个元素是前两个元素的和,可以仅用三个变量表示。
复杂度分析:
- 时间复杂度:只需要遍历一遍,O(n)
- 空间复杂度:不需要额外的空间,O(1)
代码:
class Solution { public int climbStairs(int n) { if(n < 2){ return n; } int i1 = 1; int i2 = 2; for(int i = 3; i <= n; i++){ int temp = i1 + i2; i1 = i2; i2 = temp; } return i2; } }
斐波那契数列通解
数学方法,懒得记
