70. 爬楼梯 - 力扣(LeetCode)
和打家劫舍一样的思路
1.看如何到最后一步的
①跨一级台阶到
②跨两级台阶到
则:f(x) = f(x-1) + f(x-2)
f(x)是爬到x阶的方案数量
2.考虑边界
台阶有0、1阶时只有一种方案;
f(2) = 2
f(3)= 3
...
本质斐波那契数列
这里用打家劫舍利一样用到的滚动数组
直接上代码:
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; } }p即为f(i-2),q即为f(i-1),r即为当前台阶f(i),到达当前台阶的方法数目
官方给的图多看看:70_fig1.gif (1080×480)
方便for循环直接一次性解决所有问题,像上面这样写就不用考虑前两个特殊情况了
或者这样也行:
class Solution { public int climbStairs(int n) { int p = 1; int q = 1; int r = 2; if (n == 1 ){return 1;} if (n == 2 ){return 2;} for(int i = 3; i <= n; i ++){ p = q; q = r; r = p + q; } return r; } }其实都是一样的,无非是向前或向后延长两个位置