2022跟着leedcode学数据结构--第40天

92 阅读1分钟

「这是我参与2022首次更文挑战的第40天,活动详情查看:2022首次更文挑战

image.png

[剑指 Offer 10- II. 青蛙跳台阶问题]

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

  • 输入:n = 2

  • 输出:2

  • 示例 2:

  • 输入:n = 7

  • 输出:21

  • 示例 3:

  • 输入:n = 0

  • 输出:1

  • 提示:

0 <= n <= 100

解题思路:

  • 这个题和昨天遇到的斐波那契数列很相似
  • 首先判断特殊情况,n为0 和 1,2 的情况
  • 看到动态规划的题,我们的思路就是先来个dp=[1,1]
  • 遍历2到n+1个数,将数存入dp中,dp的数量和为dp[i-1]+dp[i-2]的规律和
class Solution:
    def numWays(self, n: int) -> int:
        if n  == 0:
            return 1
        if n<2:
            return n
        dp = [1, 1]
        for i in range(2, n + 1):
            dp.append(dp[i - 1] + dp[i - 2])
        return dp[n] % 1000000007

执行结果:

image.png

[剑指 Offer 63. 股票的最大利润]

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

 

示例 1:

输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 示例 2:

输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。  

限制:

0 <= 数组长度 <= 10^5

解题思路:

- 动态规划问题
- 先判断prices 是否存在,不存在直接返回 0 
- 碰到这样的问题还是先来设置一个dp的列表
- 先获取初始值,我这里用left代替,left就是最左侧的值即prices[0]
- 遍历所有prices
- 比较left, prices[i] 取最小值,因为要利益最大化,所有左侧的值始终要取最小值
- dp[i]获取dp[i - 1], prices[i] - left 中的最大值,保证每次存储都是最大的利益值
- dp[-1]就是我们要的值
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if not prices:
            return 0
        dp = [0 for row in range(len(prices))]
        left = prices[0]
        for i in range(1, len(prices)):
            left = min(left, prices[i])
            dp[i] = max(dp[i - 1], prices[i] - left)
        return dp[-1]

执行结果:

image.png