70.爬楼梯
解题思路:
1.动态规划
2.递归(跟动态规划使用同样的公式,只不过动态规划避免了重复处理)
3.更快的数学解法(矩阵快速幂、通项公式)
package leadcode;
/**
* @author : icehill
* @description : 爬楼梯
* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
* 注意:给定 n 是一个正整数。
* <p>
* 示例 1:
* 输入: 2
* 输出: 2
* 解释: 有两种方法可以爬到楼顶。
* 1. 1 阶 + 1 阶
* 2. 2 阶
* 示例 2:
* 输入: 3
* 输出: 3
* 解释: 有三种方法可以爬到楼顶。
* 1. 1 阶 + 1 阶 + 1 阶
* 2. 1 阶 + 2 阶
* 3. 2 阶 + 1 阶
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/climbing-stairs
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* 解题思路:
* 简单题,数据的方法有矩阵快速幂、通项公式可以计算,这里就不搞了,我们用动态规划
* 1.动态规划
* 动态规划方程式:f(n)=f(n-1)+f(n-2)
* (方程式由来:
* 因为爬楼梯可能跨一级,或者跨两级,也就是达到n可能是从n-1跨一级上来,也可能是从n-2跨两级上来
* 那么n-1跟n-2又是怎么来的呢,把他们继续看做是n,则又可以把公式套进去
* )
* 我们用两个变量保存上一个节点pre跟上上个节点prePre;
* 时间复杂度:O(n) 空间复杂度O(1)
* @date : 2021-05-04
*/
public class Solution70 {
public static void main(String[] args) {
Solution70 solution70 = new Solution70();
System.out.println(solution70.climbStairs(45));
}
public int climbStairs(int n) {
if (n <= 2) {
return n;
}
int pre = 2;
int prePre = 1;
int sum = 0;
for (int i = 3; i <= n; i++) {
sum = pre + prePre;
prePre = pre;
pre = sum;
}
return sum;
}
/**
* 递归(超时)
*
* @param n
* @return
*/
public int climbStairsTwo(int n) {
if (n <= 2) {
return n;
}
return climbStairsTwo(n - 1) + climbStairsTwo(n - 2);
}
}