21.爬楼梯-Leetcode 070(python)

  • 题目描述

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

  • 解决思路一

自己想到的方法就是递归,f(1) = 1;f(2) =2;f(n) = f(n-1)+f(n-2)

实质上就是n个台阶的走法 = 走一级台阶之后,n-1个台阶的走法+走两级台阶之后,n-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)
  • 解决思路二

该问题的结果好斐波那契数列是一样的,所以,,本质上还是那个思路。不同的是用一个列表来存放着第i个元素对应的解法数量。问题解决了最起码,这就是所谓的动态规划。

  • 代码二
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        fab = [0,1,2]
        for i in range(3,n+1):
            m = fab[i-1] + fab[i-2]
            fab.append(m)
            
        return fab[n]
  • 总结

(1)递归会占用过多的内存空间和运行时间

网友总结:

(2)所有递归的方法都可以转化成非递归的方法,也就是动态规划

(3)动态规划:通过把大问题分解为相对简单的子问题的方式求解复杂问题的方法。适用于有重叠子问题和最优子结构性质的问题

(4)思想:将大问题分解成小问题,然后合并小问题的解,进而得到大问题的解。实际上就是解决了小问题之后,把小问题的解存储成一个表,当要使用的时候就查表,直接调用之前的到的结果。

(5)动态规划和分治法的思想很类似,都是把化大为小,逐个击破。区别在于分治法分成的小问题都是相互独立的,需采用递归的做法,而动态规划分成的小问题之间有一定的联系,可以通过查找来直接使用。

猜你喜欢

转载自blog.csdn.net/Try_my_best51540/article/details/83544492