Leetcode10-#121/122/124


1 #121-买卖股票的最佳时机

  • 题目:
    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
    如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
    注意:你不能在买入股票前卖出股票。

    • 示例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。
    
  • 分析:

    • 分析1:动态规划
      1 动态规划做题步骤
      • 明确 dp(i)dp(i) 应该表示什么(二维情况:dp(i)(j)dp(i)(j));
      • 根据 dp(i)dp(i) 和 dp(i-1)dp(i−1) 的关系得出状态转移方程;
      • 确定初始条件,如 dp(0)dp(0)。
        2 d p [ i ] dp[i] dp[i] 表示前 i i i天的最大利润,因为我们始终要使利润最大化,则:
        d p [ i ] = max ⁡ ( d p [ i − 1 ] , d p[i]=\max (d p[i-1], dp[i]=max(dp[i1], prices [ i ] − [i]- [i] minprice ) ) )
    • 分析2:最多进行 1 笔交易(k=1)【贪心】
      只要记录前面的最小价格,将这个最小价格作为买入价格,然后将当前的价格作为售出价格,决定是否更新当前的最大收益。注意维护两个变量:前面的最小价格 和 当前的最大收益。
  • 答案:

    • 答案1:
    class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n == 0: return 0 # 边界条件
        dp = [0] * n
        minprice = prices[0] 
    
        for i in range(1, n):
            minprice = min(minprice, prices[i])
            dp[i] = max(dp[i - 1], prices[i] - minprice)
    
        return dp[-1]
    
    • 答案2:
    class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n<=1: return 0
        buy, profit = float('inf'), 0  # 买入值 和 利润
        for curr in prices:
            profit = max(profit, curr-buy)
            buy = min(curr, buy)
        return profit
    

权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
```
参考


2 #122-买卖股票的最佳时机 II

  • 题目:
    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
    • 示例1:
    输入: [7,1,5,3,6,4]
    输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
    
    • 示例2:
    输入: [1,2,3,4,5]
    输出: 4
    解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
    
  • 分析:
    需要找出所有的升区间,计算每个升区间的价格差(峰值减去谷值)作为收益,最后把所有升区间带来的收益求和就可以了。
    对于升区间 [a, b, c, d],有 a <= b <= c <= d ,那么最大收益为 d - a。而 d - a = (d - c) + (c - b) + (b - a) ,因此每当访问到 prices[i] 比前一天价格高,即 prices[i] - prices[i-1] > 0,那么就把 prices[i] - prices[i-1] 添加到收益中。
  • 答案:

参考


3 #124-二叉树中的最大路径和

  • 题目:
    路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径 至少包含一个 节点,且不一定经过根节点。
    路径和 是路径中各节点值的总和。
    给你一个二叉树的根节点 root ,返回其 最大路径和 。

    • 示例1:
      在这里插入图片描述
    输入:root = [1,2,3]
    输出:6
    解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
    
    • 示例2:
      在这里插入图片描述
    输入:root = [-10,9,20,null,null,15,7]
    输出:42
    解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
    
  • 分析:
    递归

  • 答案:

    class Solution:
    ans = float('-inf')
    def maxPathSum(self, root: TreeNode) -> int:
        def helper(node):
            if not node: return 0
            l = helper(node.left)
            r = helper(node.right)
            self.ans = max(self.ans, max(l,0) + max(r, 0) + node.val)
            return max(l, r, 0) + node.val
        helper(root)
        return self.ans
    

参考1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值