题目介绍
题干:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
题解思路
做算法题总是逃不过这道经典的动态规划问题,相信大家和这道题也是老朋友了
对于动态规划思想,其实总结来说就是这几步
1. 建立状态转移方程
2. 缓存并复用以往结果
3. 按顺序从小往大算
看起来简单,其实在自己做起来还是一脸懵,但是在遇到爬楼梯、斐波那契函数和不同路径问题后对解法也是熟能生巧
所以大家不需要看到动态规划就觉得生无可恋,只要判断好边界条件,从小到大,由难到易还是。。。。。。很难完成
开个玩笑,当我们还停留在动态规划处理基础问题的时候,大佬们都已经对有其他更优秀的解法了,各种数学模型和高数知识直接秀的我眼花缭乱
所以除了我列出的传统方法,建议大家去看官方题解的新方法,新方法的复杂度更优
正确代码
class Solution {
public int climbStairs(int n) {
//定义三个变量,q和p表示每个台阶的方法数,用r统计所有的和
int p =0,q = 0,r = 1;
for (int i = 0; i < n; i++) {
p = q;
q = r;
r = p + q;
}
return r;
}
}
总结
做完爬楼梯的话,为了巩固和加深印象建议去做做不同路径问题,也是十分优秀的动态规划问题
其实在做多了之后,你会发现其实只要不牵扯太复杂的问题,都还是可以慢慢分析做出解答的
所以在学习传统方法之余,接触新的方法和抽空学习高数模型和知识是学习算法十分必要的,何况以后学习人工智能这都是宝贵的经验
文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见