题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
输入: n = 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶
题解
我们这里先分析下,楼梯有一级时,只有一种爬楼梯方法,当楼梯有两级时,有两种爬楼梯的方法,可以直接爬两级,或者一级一级爬,以此类推,当楼梯有n
级时,爬楼梯的次数等于第n-1
级的次数加上第n-2
级的次数
根据上述分析,我们在进入函数中先声明两个变量,分别是n1
变量和n2
变量,n1
变量值为1
代表着一级楼梯,n2
变量值为2
代表着二级楼梯,在声明一个res
变量,res
变量值默认为0
,用于存储爬n
级楼梯的多少种方法,在使用if
语句进行判断当前出参n
是否等于1
或等于2
,如果为1
或者2
则直接把当前的出参n
返回即可,因为一级楼梯和二级楼梯的爬楼梯方法与楼梯级数所对应,接下来我们使用for
循环的方式对出参n
进行循环,循环变量i
默认值是3
,因为三级楼梯有三种爬楼梯方法,变量n1
和变量n2
相加正好等于三级楼梯的爬楼梯总方法,循环终止条件是当前循环变量i
的值等于出参n
,在循环中我们将变量n1
和变量n2
的值相加赋值给res
变量,然后再将n2
变量值赋值给变量n1
,再将变量res
变量值赋值给n2
,以此去计算出每增加一级楼梯的爬楼梯的方法数,当循环结束后,我们将res
变量返回即可
/** * @param {number} n * @return {number} */ var climbStairs = function(n) { let n1 = 1; let n2 = 2; let res = 0; if(n == 1||n == 2) { return n; } for(let i=3; i<=n;i++){ res = n1 + n2; n1 = n2; n2 = res; } return res; };