编程实践笔记No.10

本文档介绍了三种股票交易问题的解决方案:121题的单次交易最大利润,通过枚举法和最小-最大值法;121题的多次交易优化,采用一次遍历寻找上升趋势;以及124题二叉树最大路径和的递归策略。通过实例解析提升编程技巧。
摘要由CSDN通过智能技术生成


写在最前面,编程一直是我的短板,希望在leetcode练习中获得进步!

参考Datawhale组队学习中“LeetCodeTencent”

题目一121 买入卖出股票的最佳时机

链接

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

只买一次,只买一只股票

思路

枚举法

第一想到的是枚举,全部例举一遍:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        length = len(prices)
        max_profit = 0
        # 2个for循环遍历所有可能
        for i in range(length):
            for j in range(i,length):
                cur_profit = prices[j]-prices[i]
                if cur_profit > max_profit:
                    max_profit = cur_profit #记录最大利润
    
        if max_profit < 0:
            max_profit = 0
        return max_profit

时间复杂度O(N^2)
在这里插入图片描述

最小-最大值

计算每次 到当天为止 的最小股票价格和最大利润

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        max_profit = 0
        min_price = prices[0]
        for price in prices:
            if price < min_price:
                min_price=price
            cur_profit = price-min_price
            if cur_profit > max_profit:
                max_profit = cur_profit
        if max_profit < 0:
            max_profit = 0
        return max_profit

在这里插入图片描述

参考链接

题目二121 买入卖出股票的最佳时机

链接

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

可以买多次,买的仍是一只股票

思路

一次遍历

寻找上升趋势

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        length = len(prices)
        deltas = []
        for i in range(1,length):
            delta = prices[i] - prices[i-1]
            if delta < 0:
                delta = 0
            deltas.append(delta)
        max_profit = sum(deltas)
        return max_profit

在这里插入图片描述

题目三124 二叉树中的最大路径和

链接

给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

思路

递归

class Solution:
    def __init__(self):
        self.maxSum = float("-inf")

    def maxPathSum(self, root: TreeNode) -> int:
        def maxGain(node):
            if not node:
                return 0

            # 递归计算左右子节点的最大贡献值
            # 只有在最大贡献值大于 0 时,才会选取对应子节点
            leftGain = max(maxGain(node.left), 0)
            rightGain = max(maxGain(node.right), 0)
            
            # 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
            priceNewpath = node.val + leftGain + rightGain
            
            # 更新答案
            self.maxSum = max(self.maxSum, priceNewpath)
        
            # 返回节点的最大贡献值
            return node.val + max(leftGain, rightGain)
   
        maxGain(root)
        return self.maxSum

在这里插入图片描述

链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值