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

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

题目

509.斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 01 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n)

# 递归
class Solution:
    def fib(self, n: int) -> int:
        if n == 1 or n == 0:
            return n
        else:
            return self.fib(n - 1) + self.fib(n - 2)
# 动归
class Solution:
    def fib(self, n: int) -> int:
        # 这个判断只要是防止当n=1时,下面对dp[1]赋值导致数组越界
        # if n == 0:
        #     return 0
        # dp = [0] * (n + 1)
        # 或者直接多开一个位置
        dp = [0] * (n + 2)
        dp[0], dp[1] = 0, 1
        for i in range(2, n + 1):
            dp[i] = dp[i - 1] + dp[i - 2]
        return dp[n]

题目

70.爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

class Solution:
    def climbStairs(self, n: int) -> int:
        dp = [0] * (n + 2)
        dp[1], dp[2] = 1, 2
        for i in range(3, n + 1):
            dp[i] = dp[i - 1] + dp[i - 2]
        return dp[n]

题目

746.使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0] * (len(cost) + 1)
        if len(cost) < 2:
            return 0
        for i in range(2, len(cost) + 1):
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
        return dp[len(cost)]

你可能感兴趣的:(代码随想录,算法,leetcode,动态规划)