70.爬楼梯

'''
Description: 70.爬楼梯
Autor: 365JHWZGo
Date: 2021-11-14 19:17:39
LastEditors: 365JHWZGo
LastEditTime: 2021-11-14 20:03:50
'''

根据题目知:
每一步可以爬一阶台阶或两阶台阶
现在随机给定n阶台阶,问有几种爬楼梯的方法?

思路1:
    倒推法【递归法】
    假设有5阶台阶,那么我用倒推的方法可以知道,我要么前一步是爬了1阶台阶,要么爬了2阶台阶
    f(5)=f(4)+f(3)
        假设我是爬了1阶台阶上来的,那么在倒推,我在第4阶台阶是爬了1阶台阶,还是爬了2阶台阶
        f(4)=f(3)+f(2)
        ...

        假设我是爬了2阶台阶上来的,那么在倒推,我在第3阶台阶是爬了1阶台阶,还是爬了2阶台阶
        f(3)=f(2)+f(1)
        ...
    
    总结起来就是:
    f(5)=f(4)+f(3)
        =f(3)+f(2)+f(2)+f(1)
        =f(2)+f(1)+f(2)+f(2)+f(1)
        =2+1+2+2+1
        =8
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """       
        #method1:
        if n == 1:
            return 1

        if n == 2:
            return 2
        
        return self.climbStairs(n-1)+self.climbStairs(n-2)

70.爬楼梯_第1张图片
显然,它不是力扣想要的算法思想。

思路2:
	动态规划
	由题可知每一步得出的结果都是由前面一步走的方法决定的,具有重叠子问题性质
	假设假设还是有5阶台阶
	f(0)=1                  #呆在原地,至于为什么是1,是因为它可以直接从原地爬2阶,为f(2)做好准备
	f(1)=1                  #爬到第1阶台阶时,当前爬1阶台阶之前的方法
	f(2)=f(1)+f(0)=2        #爬到第2阶楼梯时,当前爬了1阶之前的方法,当前爬了2阶台阶之前的方法
	...
	f(5)=f(4)+f(3)
	=>
	f(n)=f(n-1)+f(n-2)
      

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

70.爬楼梯_第2张图片
该方法与我之前写的509.斐波那契数异曲同工,可以试一试呀!

你可能感兴趣的:(动态规划,算法)