033-力扣刷题-70--爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
1 2 3 4 5 | 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 |
示例 2:
1 2 3 4 5 6 | 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶 |
1 2 3 4 5 6 7 8 9 10 | class Solution(object): def climbStairs(self, n): """ :type n: int :rtype: int """ a,b=0,1 #实际上就是个斐波那契数列,只不过a从0,b从1开始,原因是我们要循环的是n次,所以第一次循环得到的是1,1继续向下循环就好了 for i in range(n): a,b=b,a+b return b#返回最后b就是组合的种数 |
分类计数原理,也就是加法原理:如果完成一件事的方法分为(不重不漏的)两类,第一类有x种方法,第二类有y种方法,那么完成这件事的方法共有x+y种。这个很好理解,谁都想得通。 到本题,假设走到第n层楼梯的方法数为f(n)。走到第n层楼梯的方法可以分为两类:第一类,先走到第n-1层,然后走一级楼梯,这类方法有f(n-1)种;第二类,先走到第n-2层,然后走两级楼梯,这类方法有f(n-2)种。仔细想想,这两类方法覆盖了到达第n层楼梯的所有方法,且彼此没有重复,那么根据加法计数原理:f(n)=f(n-1)+f(n-2)。