leetcode70题 题解 翻译 C语言版 Python版

70. Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

70.爬楼梯

你现在在爬一个楼梯,到顶一共是n步。

每次你能上一步或者上两步。那么你能有多少种不同的方式爬到顶呢?


思路:这题很明显使用递归解决。判断n需要多少步时只需要将n-1的步数及n-2的步数相同即可。递归的终点是n为1或n为2时,n为1时返回1,n为2时返回2。不过这题在leetcode上使用递归提交的话会遇到超时的问题,显然出题者不希望我们用递归去解决。因为递归都能转化成循环结构,所以我们尝试用一个简单的循环来解决此题。用递归时思想是从高台阶往低台阶一阶阶的往下推,然后从低台阶到高台阶一阶阶的递归返回得到结果。基于这种思想我们在设计循环时应该把握低台阶到高台阶递归式的办法。比如说,当前要求5阶,那么从1阶开始推2阶,再推3阶,一阶阶推到5阶。限于题意,此题应当两阶两阶的向上推。那么可以想像到,我们保留第n-2阶的步数种类为p,保留n-1阶的步数种类为q,那么当前n阶的步数种类就是t=p+q,那么进入下一个循环我们要面对的是n-1阶和n阶去推导n+1阶的步数种类,所以要将n-1阶的步数种类设成p,n阶的步数种类设成q,然后进行下一步的推导。这中间有一个变量传递的问题,需要认真理解。


int climbStairs(int n) {
    if (n < 3) return n;
    int p = 1;
    int q = 2;
    for (int i = 0; i < n - 2; i++){
        int t = p + q;
        p = q;
        q = t;
    }
    return q;
}

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 3: return n
        p, q = 1, 2
        for i in range(n-2):
            p, q = q, p+q
        return q


你可能感兴趣的:(leetcode)