代码随想录算法训练营第三十八天| 509. 斐波那契数、 70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划五部曲:

  1. dp数组的含义以及dp[i]的含义。

  1. 递推公式

  1. dp数组如何初始化

  1. 遍历顺序(比如背包问题,两层for循环,每层for循环对应的含义,ex:第一层for代表背包,第二层for代表物品)

  1. 打印dp数组(Debug)

Leetcode - 509

以标准的五部曲去做,我们要求的是第n个位置的斐波那契数值,为了方便,我们定义一个长度为n+1的dp数组,下标刚好能到n。

def fib(self, n: int) -> int:
#判断边界
        if n <2:
            return n
         #初始化dp数组   
        dp = [0] * (n+1)
#利用已有的信息进行初始化
        dp[1] = 1
# 以能满足递推公式的最小位置为起始点开始递归,比如某个元素值要由前两个元素值决定,那么开始位置至少是第三个位置
        for i in range(2,n+1):
            dp[i] = dp[i-1] + dp[i-2]

        return dp[n]

另一种线性时间复杂度的解法,也必须要掌握,面试里我被考到过

def fib(self, n: int) -> int:
        if n <2:
            return n
        #初始化a,b为起始值,第三个位置的值就等于a + b
        a,b = 0,1
        i = 1
        while i 

Leetcode - 70

这题和斐波拉契数列是一样的,因为从第三个阶梯开始,他既可以由第一个阶梯爬两步到达,也可以由第二个阶梯爬一步到达。就有了递推公式dp[i] = dp[i-1] + dp[i+1]。

dp数组依然初始化为n+1长度

dp[0] = 0, dp[1] 一步到达 所以值为1, dp[2] 可以从0走两步到,也可以先到1再到2,两步完成,所以dp[2] =2,从dp[3]开始我们就可以进行递推了。

def climbStairs(self, n: int) -> int:
        if n <3:
            return n

        dp = [0] * (n+1)
        dp[1] = 1
        dp[2] = 2

        for  i in range(3,n+1):
            dp[i] = dp[i-1] + dp[i-2]
       
        return dp[n]

由于递推公式是一样,同样可以用线性时间复杂度方法完成

def climbStairs(self, n: int) -> int:
        if n <3:
            return n

        a,b =1,2
        c = 0
        i = 2
        while i 

Leetcode - 746

首先要知道一点,就是本题是要求我们越过第n个阶梯,也就是到达下标n+1处,我们的0阶梯是可以作为起始点,而且0阶梯也是有对应的cost值的,所以这题dp[0]我们可以利用起来,dp[n]是我们想要的值。

ex: cost[12,18,20] 可以从0或1位置出发,最小花费是18,因为12只能走两步到第三个位置,并没有越过第3个台阶,因此是到达不了的,从0出发的花费是12 +20,所以从1位置出发,花费更少。

初始化:dp[0]可以利用上,这里dp[0]开始初始化,dp[i]的意义是到达i下标对应阶梯所需的最小花费,dp[0]可以直接到达,无需花费,所以是0,dp[1]可以由 第0层爬一层到达,也可以从1位置直接出发,取两者消费最小值即可,所以dp[1] = min(cost[0],cost[1])。

每个台阶,可以由前两个台阶爬到,所以我们只需要比对从前两个阶梯爬过来的两种方案,这里,我们仅仅考虑前两个台阶的cost是不够的,此时我们要加上到达前两个台阶的最小花费 ,这样综合考虑出最佳方案

n = len(cost)
        if n ==2:
            return min(cost)

     
        dp = [0] * (n+1)
        dp[1],dp[2] = 0,cost[0]

        for i in range(3,n+1):
            dp[i] = min(dp[i-1] + cost[i-1],dp[i-2] + cost[i-2])

        return dp[-1]

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