【Task10】LeetCode腾讯精选打卡

一、No0121. 买卖股票的最佳时机

题目

给定一个数组,它的第 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。

思路:

用first储存头部值,用res储存最大利润。对prices进行循环,考虑下面三种情况:

  1. 若当前值大于first,计算当前利润,并与res进行比较,若比res大则更新res;
  2. 若当前值小于first,则更新first;
  3. 若当前值等于first,保持不变;

解题代码(Python3)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if prices == []:
            return 0
        res = 0
        first = prices[0]
        for x in prices[1:]:
            if x > first:
                temp = x - first
                res = max(res,temp)
            #移动初始值
            elif x < first:
                first = x
        return res

复杂度分析:

  • 时间复杂度O(n)
  • 空间复杂度O(1)

运行结果:

【Task10】LeetCode腾讯精选打卡_第1张图片

二、No0122. 买卖股票的最佳时机 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 天接连购买股票,之后再将它们卖出。
    因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例3

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

思路:

总体思路和121题保持相同

  1. 异常值判空
  2. 变量说明:
  • res变量用于存储结果即总体利润;
  • maxV变量用于存储当前关注的局部最大利润;
  • left和right表示局部最大利润的左右值(均为闭),初始化为第一个元素;
  1. 整体思路:
    对prices中第一个元素之后的元素进行循环,由于left<=right,所以考虑当前值x和左右值的四种关系:
  • x < left时, 说明应该清仓,此时操作:res加上maxV,left、right、maxV进行初始化;
  • left <= x
  • x == rights时,无需清仓,继续观望,不做任何操作;
  • x > right时,无需与最大值进行比较,因为此时一定是最大,更新right和maxV;

综上循环体内只需进行两个分支操作。

最后别忘了由于直接[1,2,3,4,5]这样的直接收盘的情况,需要在返回res之前加上maxV。

代码如下:

解题代码(Python3)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if prices == []:
            return 0
        res = maxV = 0
        left = right = prices[0]
        for x in prices[1:]:
            if x > right:
                right = x
                maxV = right - left
            elif x < right:
                left = right = x
                res += maxV
                maxV = 0
        #防止直接收盘
        res += maxV
        return res

复杂度分析:

  • 时间复杂度 O(n)
  • 空间复杂度 O(1)

运行结果:

【Task10】LeetCode腾讯精选打卡_第2张图片

三、No0124. 二叉树中的最大路径和

题目

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例1

【Task10】LeetCode腾讯精选打卡_第3张图片

  • 输入:root = [1,2,3]
  • 输出:6
  • 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例2

【Task10】LeetCode腾讯精选打卡_第4张图片

  • 输入:root = [-10,9,20,null,null,15,7]
  • 输出:42
  • 解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示

  • 树中节点数目范围是 [1, 3 * 104]
  • -1000 <= Node.val <= 1000

思路:

总体采用递归的思想,递归中包含了迭代的思想,一共要做两个事:

  • 承上启下
  • 维护最大值res

具体而言:

  • 在每层递归函数中,首先比较res和当前值(left+right+node.val),若小于则进行维护,注意这里的递归体现在求解左右子树的最大权重中,这里注意要对小于0的结果进行断尾操作;
  • 在递归函数的最后要返回可供上层调用的最大权重值(node.val + max(left,right)

解题代码(Python3)

class Solution:
    def __init__(self):
        self.res = -float('inf')
    def maxPathSum(self, root: TreeNode) -> int:
        #递归
        def getNodeMaxPathSum(node):
            if node == None:
                return 0
            left = max(getNodeMaxPathSum(node.left),0)
            right = max(getNodeMaxPathSum(node.right),0)
            self.res = max(self.res,node.val + left + right)
            return node.val + max(left,right)
        getNodeMaxPathSum(root)
        return self.res

复杂度分析:

  • 时间复杂度O(n)
  • 空间复杂度O(h) 递归需要存树的深度

运行结果:

【Task10】LeetCode腾讯精选打卡_第5张图片

感想:

  1. 思考递归问题,思考方式自顶向下,子问题自下而上解决;
  2. 递归不止能做一件事,比如结合迭代;

参考文献

1.「手画图解」别纠结递归的细节 | 124.二叉树中的最大路径和

https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/shou-hui-tu-jie-hen-you-ya-de-yi-dao-dfsti-by-hyj8/

你可能感兴趣的:(#,LeetCode,腾讯精选练习,50,题,霍乱时期的Python之路,python,数据结构,leetcode,算法,datawhale)