leetcode 70. 爬楼梯

【前言】

           python刷leetcode题解答目录索引:https://blog.csdn.net/weixin_40449300/article/details/89470836

           github链接:https://github.com/Teingi/test 

【正文】

 

假设你正在爬楼梯。需要 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 阶

思路

基本的动态规划问题,对于第n级台阶来说,有2种方法,1是到第n-1级,然后爬一个台阶;2是到第n-2个台阶,然后爬2个台阶,可以得出动态规划递推式:

F(n)=F(n−1)+F(n−2)F(n)=F(n−1)+F(n−2)

n=1n=1的时候为1;n=2n=2的时候为2

代码一:递归(时间超过限制)

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n==1:
            return 1
        elif n==2:
            return 2
        else:
            return self.climbStairs(n-1) + self.climbStairs(n-2)

但是我们将递归拆开来看就会发现一个巨大的问题,f(n) = f(n-1)+f(n-2),为了求一个f(n),我们要多次计算前面的数值,这样既浪费了内存,又浪费了计算能力,那有没有更简单的算法呢?答案是必然的.使用循环我们就可以避免这个问题. 

代码二:

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n==1:
            return 1
        elif n==2:
            return 2
        else:
            tmp = [1,2]
            for i in range(2,n):
                tmp.append(tmp[i-1] + tmp[i-2])
            return tmp[-1]

java代码:动态规划思想

简洁的自底向上,只保留运算下一个所需要的数字,其余的不要,所以空间固定

class Solution {
    public int climbStairs(int n) {
        if(n<0){
			return 0;
		}
		if(n==1){
			return 1;
		}
		if(n==2){
			return 2;
		}
		int first=1;
		int second=2;
		int third=0;
		for(int i=3;i<=n;i++){
			third=first+second;
			first=second;
			second=third;
		}
		return third;
    }
}

 

 

你可能感兴趣的:(Leetcode,Java,Test)