Day38 爬楼梯
2021-03-04 本文已影响0人
Shimmer_
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
https://leetcode-cn.com/problems/climbing-stairs/
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
Java解法
思路:
- n个台阶,可以走一个或2个,走法可分类为
- 0 到n/2个 两步,n-(n/2)*2个 一步
- 同一数量两步的不同排列(气死,这步不会,得搞下全排列做法)
- 动态规划
- f(x) = f(x-1)+f(x-2); 第N个等于n-1走法与n-2之和
package sj.shimmer.algorithm.m2;
/**
* Created by SJ on 2021/3/3.
*/
class D38 {
public static void main(String[] args) {
System.out.println(climbStairs(2));
System.out.println(climbStairs(3));
System.out.println(climbStairs(5));
System.out.println(climbStairs(10));
}
public static int climbStairs(int n) {
int[] sum = new int[n+1];
for (int i = 1; i <= n; i++) {
if (i == 1) {
sum[i] = 1;
} else if (i == 2) {
sum[i] = 2;
} else {
sum[i] = sum[i-1]+sum[i-2];
}
}
return sum[n];
}
}

官方解
https://leetcode-cn.com/problems/climbing-stairs/solution/pa-lou-ti-by-leetcode-solution/
-
动态规划
参考的解法,官方使用滚动数组替换了数组来节省空间计算,让空间复杂度从 O(n) 降到了 O(1)
class Solution { public int climbStairs(int n) { int p = 0, q = 0, r = 1; for (int i = 1; i <= n; ++i) { p = q; q = r; r = p + q; } return r; } }
image
- 时间复杂度:O(n)
- 空间复杂度:O(1)
-
矩阵快速幂、通项公式(这就是让我气愤的地方,竟然是简单题,数学知识忘光了我个菜鸡)