leetcode 121、122、123、188、309、714 买卖股票的最佳时机

LeetCode123——买卖股票的最佳时机III 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ 题目描述: 知识点:动态规划 思路一:分解成两个LeetCode121——买卖股票的最佳时机子问题 枚举第一笔交易... 阅读详情

题目描述:
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)即每个时刻只能有一股

各个题目的区别:
121——买卖一次
122——买卖无数次
123——最多买卖两次
188——买卖k次
309——有冷冻期,但是可以买卖无数次
714——每买卖一次有手续费,但是可以买卖无数次

思路:
动态规划,不同难度的问题,dp状态定义的维度和状态转移方程也是不一样的。
注意以下代码都是为了系统地比较各个问题的区别,可能每一段代码都可以进一步简化空间复杂度,但是dp的思路都是一样的。
121——买卖一次
dp[i]:到了第i 天的最大利润

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if not prices:
            return 0
        res = 0
        # 注意初始化的方式
        proit = [[0 for i in range(3)] for i in range(len(prices))]
        print(proit)
        proit[0][0], proit[0][1], proit[0][2] = 0, -prices[0], 0
        for d in range(1, len(prices)):
            # 三个状态分别是:没有买卖,已经买入一股,已经卖出一股
            proit[d][0] = proit[d-1][0]
            proit[d][1] = max(proit[d-1][1], proit[d-1][0] - prices[d])
            proit[d][2] = proit[d-1][1] + prices[d]
            res = max(res, proit[d][0], proit[d][1], proit[d][2])
        return res

122——买卖无数次:
dp[i][0]: 到了第i 天的最大利润,且此时手里没有股票,故可以选择买和不买
dp[i][1]:到了第i 天的最大利润,且此时手里有股票,故可以选择卖或者不卖

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        res = 0
        proit = [[0 for i in range(2)] for i in range(len(prices))]
        proit[0][0], proit[0][1] = 0, -prices[0]
        for d in range(1, len(prices)):
        # m每次可以考虑买和卖两种情况
            proit[d][0] = max(proit[d-1][0], proit[d-1][1] + prices[d])
            proit[d][1] = max(proit[d-1][1], proit[d-1][0] - prices[d])
            res = max(res, proit[d][0])
        return res

123——最多买卖两次
dp[i][k][0] : 第i 天的利润,此时已经完成交易 k 次,手里没有股票
dp[i][k][0] : 第i 天的利润,此时已经完成交易 k 次,手里有股票
所以这里k有0,1,2三种可能情况,直接列举出来,这样减少一轮循环;
同样本题可以采用188的代码,将K设置为2。

import sys
maxint = sys.maxsize


class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        res = 0
        proit = [[[0 for i in range(2)] for i in range(3)] for i in range(len(prices))]
        proit[0][0][0], proit[0][0][1] = 0, -prices[0]
        proit[0][1][0], proit[0][1][1] = -maxint, -maxint
        proit[0][2][0], proit[0][2][1] = -maxint, -maxint
        for d in range(1, len(prices)):
            proit[d][0][0] = proit[d-1][0][0]
            proit[d][0][1] = max(proit[d-1][0][1], -prices[d])
            proit[d][1][0] = max(proit[d-1][1][0], proit[d-1][0][1] + prices[d])
            proit[d][1][1] = max(proit[d-1][1][1], proit[d-1][1][0] - prices[d])
            proit[d][2][0] = max(proit[d-1][2][0], proit[d-1][1][1] + prices[d])
            proit[d][2][1] = max(proit[d-1][2][1], proit[d-1][2][0] - prices[d])
            res = max(res, proit[d][0][0], proit[d][1][0], proit[d][2][0])
        return res

188——买卖k次
dp[i][k][0] : 第i 天的利润,此时已经完成交易 k 次,手里没有股票
dp[i][k][0] : 第i 天的利润,此时已经完成交易 k 次,手里有股票

import sys
maxint = sys.maxsize


class Solution(object):
    def maxProfit(self, k, prices):
        """
        :type k: int
        :type prices: List[int]
        :rtype: int
        """
        if not prices:
            return 0
        res = 0
        proit = [[[0 for i in range(2)] for i in range(k+1)] for i in range(len(prices))]
        proit[0][0][0], proit[0][0][1] = 0, -prices[0]
        for j in range(1, k):
            proit[0][j][0], proit[0][j][1] = -maxint, -maxint
        for d in range(1, len(prices)):
            proit[d][0][0] = proit[d-1][0][0]
            proit[d][0][1] = max(proit[d-1][0][1], -prices[d])
            for w in range(1, k+1):
                proit[d][w][0] = max(proit[d-1][w][0], proit[d-1][w-1][1] + prices[d])
                proit[d][w][1] = max(proit[d-1][w][1], proit[d-1][w][0] - prices[d])
                res = max(res, proit[d][w][0], proit[d][0][0])
        return res

309——有冷冻期,但是可以买卖无数粗
状态定义和转移详见代码

import sys
maxint = sys.maxsize

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if not prices or len(prices) == 1:
            return 0
        res = 0
        proit = [[0 for i in range(3)] for i in range(len(prices))]
        '''
        每天会有两种状态,持有和不持有,但是由于存在冷冻期,将不持有的情况分为两种:
        1. 会导致第二天冷冻期
        2. 不会导致第二天冷冻期
        '''
        proit[0][0], proit[0][1], proit[0][2] = 0, -prices[0], -maxint
        # 1-持有一股 0-不持有,不会导致第二天处于冷冻期 2-不持有,会导致第二天处于冷冻期
        for d in range(1, len(prices)):
            proit[d][1] = max(proit[d-1][1], proit[d-1][0]-prices[d])
            proit[d][0] = max(proit[d-1][0], proit[d-1][2])
            proit[d][2] = proit[d-1][1]+prices[d]
        res = max(res, proit[d][0], proit[d][2])
        return res

714——每买卖一次有手续费,但是可以买卖无数次
同122很像,只是多了一个手续费,体现在状态转移方程那里。

import sys
maxint = sys.maxsize


class Solution(object):
    def maxProfit(self, prices, fee):
        """
        :type prices: List[int]
        :type fee: int
        :rtype: int
        """
        if not prices or len(prices) == 1:
            return 0
        res = 0
        proit = [[0 for i in range(2)]for i in range(len(prices))]
        proit[0][0], proit[0][1] = 0, -prices[0]
        for d in range(1, len(prices)):
            proit[d][0] = max(proit[d-1][0], proit[d-1][1]+prices[d]-fee)
            proit[d][1] = max(proit[d-1][1], proit[d-1][0]-prices[d])
            res = max(res, proit[d][0], proit[0][0], proit[d][1])
        return res

扩展:
在现在的研究问题中,每个时刻只能持有一股,若题目变成可以持有n股,则:
dp[i][k][j]: j 从{0,1}变成0~j,此时状态转移:
dp[i][k][j] = max{
dp[i-1][k][j]; 不动
dp[i-1][k-1][j+1]+q[i]; 卖
dp[]i-1][k][j-1] - q[i]; 买
}
这时状态转移变得复杂,需要注意数组越界问题等。

day44| 121. 买卖股票的最佳时机122买卖股票的最佳时机II123买卖股票的最佳时机III 188买卖股票的最佳时机IV309买卖股票的最佳时机含冷冻期714.买卖股票的最佳时机含手续费 设想的对象是手里的现金;持有股票的话,手里只有股票无现金,一定钱是少的;最后肯定是不持有股票的时候手里头的现金多;我理解的总体思路:因为最后一定是不持有手里的现金多,而不持有的最大值需要由前一天持有的最大值推出,所以每天都需要分别求持有和不持有的各自的max;dp五部曲💕dp数组及其下标含义:设置dp[i][0]和dp[i][1]dp[i][0]表示第i天持有这只股票手里的现金最大是多少dp[i][1]表示第i天不持有这只股票手里的现金最大是多少。 阅读详情

相关推荐

力扣买卖股票的最佳时机 II

买卖股票的最佳时机 II思路:代码片 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格...

dayday学习的博客 972

Python版-LeetCode 学习:买卖股票的最佳时机(121,122,123,188,309,714)

买卖股票的最佳时机 交易次数K=1 给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;...

谷雨的博客 236

【java】力扣 买卖股票的最佳时机II

力扣 买卖股票的最佳时机II

qq_55846232的博客 643

js + leetcode刷题:买卖股票的最佳时机系列六题一文No.121、122、123、188、309、714

这是我头一次学会从关联题目里面,慢慢做一系列相关的题目。也是第一次学会系列文可以帮助你进行一个整体思考,而不是每道题都绞尽脑汁的按照题目的要求完成符合条件的代码,而无延展性。 题目: 本文题目只进行简单描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 注意:你不能在买入股票前卖出股票。 1. 121 只完成一笔交易 2. 122 尽可能多完成交易 3. 123 最多完成...

qq_34425377的博客 262

主成分分析避坑指南:为什么你的PCA结果总是不理想?

本文深入剖析了主成分分析(PCA)在实际应用中效果不佳的常见原因与解决方案。针对数据标准化、协方差矩阵选择、主成分数量确定、载荷矩阵解读等关键环节,提供了详细的避坑指南和诊断方法,并探讨了PCA的局限性及非线性数据结构下的备选方案,帮助数据分析师获得更稳健、可解释的降维结果。

convnet3designer的博客 511

工业预测模型避坑指南:PHM2012轴承数据实战中,LSTM、CNN、Transformer到底怎么选?

本文深入探讨了工业预测模型在PHM2012轴承数据下的选型策略,对比了LSTM、CNN和Transformer等主流模型在轴承寿命预测任务中的表现。通过真实实验数据,提供了可复现的选型决策框架,帮助工程师根据数据规模、硬件条件和精度要求选择最佳模型。文章还揭示了工程落地中的隐藏陷阱,如数据不均衡和工况迁移挑战,并提出了解决方案。

weixin_33694172的博客 493

【算法与数据结构】121、122、123、188、309、714、LeetCode买卖股票的最佳时机I II III IV+含冷冻期+含手续费

所有的LeetCode题解索引,可以看这篇文章——。

晚安的博客 787

ggml_cgraph 详解

是 GGML 库的(Computation Graph)结构,它是深度学习框架的核心,用于表示、优化和执行神经网络的计算过程。

zhouzwd87的专栏 1203

LeetCode 121、122、123、188、309、714. 买卖股票的最佳时机(及Ⅱ、Ⅲ、Ⅳ、含冷冻期、含手续费)

LeetCode 121.买卖股票的最佳时机 描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 ...

mbytes的博客 217

Qt实现窗口自适应分辨率大小

如果希望窗口大小始终保持与屏幕分辨率一致,可以将上述代码放在窗口的resizeEvent()函数中。这样,每当窗口大小发生变化时,都会自动调用resizeEvent()函数,从而实现窗口大小的自适应调整。在Qt中,可以通过一些简单的方法实现窗口大小随分辨率变化而自适应调整。获取到当前屏幕的分辨率后,可以根据需要调整窗口的大小。无论在何种分辨率下运行应用程序,窗口都能够正确地自动调整大小,提供更好的用户体验。除了调整窗口大小,还可以考虑将窗口设置为最大化,以充分利用屏幕空间。步骤2:调整窗口大小。

FuJavascript的博客 3655

YOLO系列算法改进 | C3k2改进篇 | 融合MambaOut轻量化门控架构 | 纯卷积实现超越Mamba性能的同时兼顾极致轻量化与边缘部署效率 | CVPR 2025

YOLO系列算法改进 | C3k2改进篇 | 融合MambaOut轻量化门控架构 | 纯卷积实现超越Mamba性能的同时兼顾极致轻量化与边缘部署效率 | CVPR 2025 (以YOLOv26最新目标检测模型为基础,利用C3k2_MambaOut创新模块进行改进)

2502_91881744的博客 224

python股票交易最大值最多可以完成k比交易_Python版-LeetCode 学习:买卖股票的最佳时机(121,122,123,188,309,714)...

买卖股票的最佳时机 交易次数K=1给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1: 输入: [7,1,5,3,6,4] 输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润...

weixin_36269334的博客 627

SmartFusion从FPGA到ARM(九)——串口命令解析器的实现

系列教程:SmartFusion从FPGA到ARM系列教程 前面两节介绍了MSS_UART和CoreUARTapb的使用: MSS_UART的使用 CoreUARTapb的使用 MSS_UART和CoreUARTapb都支持中断和轮询方式获取串口接收的数据,对于串口中断服务函数,有时我们需要通过不同的串口指令去执行不同的动作,下面以CoreUARTapb为例,来实现一个简单的串口命令解析器。固定串口数据帧格式,帧长度不定。 串口数据帧格式:* + 数据 + #,对于数据中为参数的,可以自定义处理函数。例

whik1194的博客 1535

《LeetCode》—— 买卖股票的最佳时机

动态规划题目的讲解

m0_56069910的博客 3550

环形平滑标签(Circular Smooth Label, CSL)技术详解

环形平滑标签(CSL)是一种优化算法,旨在解决旋转目标检测中角度预测的边界问题。通过将角度回归转化为分类任务,并利用窗口函数平滑标签分布,CSL有效处理了角度周期性的梯度突变问题。其核心原理包括角度离散化和平滑标签编码,通过高斯、矩形、三角等窗口函数生成概率分布。CSL在技术实现上涉及标签转换流程、模型结构调整和损失函数优化,显著提升了检测精度和稳定性。在DOTA数据集上的实验表明,CSL在mAP和角度误差方面优于传统方法。应用场景包括遥感图像分析、自动驾驶和工业质检,部署时需注意旋转NMS编译和ONNX导

浩瀚之水的专栏 640

第二大脑的觉醒:一个寄生在代码里的小生命,如何悄无声息地接管我的工作流

所有记忆都存在本地。

步子哥的博客 1064

代码随想录算法训练营第 42 天 |LeetCode 188.买卖股票的最佳时机IV LeetCode309.最佳买卖股票时机含冷冻期 LeetCode714.买卖股票的最佳时机含手续费

股票问题

2301_79647020的博客 2358

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode 188:买卖股票的最佳时机 IV

buy[i][j]:前i天完成j笔交易,当前持有股票的最大利润。sell[i][j]:前i天完成j笔交易,当前不持有股票的最大利润。

m0_75126572的博客 1959

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

力扣188-买卖股票的最佳时机 IV(Java详细题解)

注意看dp数组的定义,dp[i] [0]的状态是不操作 dp[i] [1]才表示第一次持股,而我们的j是从0开始遍历。dp[0] [3] 表示下标为0天第二次持股 那就是第一买卖结束后 再买入股票 也是 -prices[0]第一次的dp[i-1] [0]就是相等于 0 ,也就是第一买入股票就等于 0 - 这次买入股票的现金。dp[0] [1] 表示下标为0天第一次持股 那肯定就是当天买入股票 就为 -prices[0]dp[0] [j]是递推的起始位置,所以我们要初始化dp[0] [j]。

2302_79761426的博客 1832

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【力扣刷题实战】买卖股票的最佳时机

文章目录目录力扣题目:买卖股票的最佳时机题目描述解题思路问题理解算法选择具体思路解题要点完整代码(C++)兄弟们共勉 !!! 每篇前言原题链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)给定一个数组 ,它的第 个元素 表示一支给定股票第 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 。示例 1: 输入:[7,1,5,3,6,4] 输

2401_85548793的博客 1147

【dp力扣】买卖股票的最佳时机III

要定义好状态表示,我们要分析这道题目到底有那些状态。最明显的,buy可买入股票),own持有股票)这两种。但是还有一个重要的状态,就是交易次数(最多两次,题目明确约束了交易次数最多两次。另一个重要的状态就是当前的天数(最大取决于prices长度。也就是说这个状态表示要包含这样的信息:【第i天】,【最终是j交易状态】,【交易了k次】也就是三个维度。所以要用用3维数组?可以,但没必要。/*own[i][j]代表第i天持有股票,交易了j次的最大利润。

HYY的博客 1692

【java】力扣 买卖股票的最佳时机III

java版的买卖股票的最佳时机III 用的动态规划

qq_55846232的博客 1456

算法学习——LeetCode力扣动态规划篇7(188. 买卖股票的最佳时机 IV、309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费)

算法学习——LeetCode力扣动态规划篇7(188. 买卖股票的最佳时机 IV、309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费)

拉依达不拉跨的博客 1436

力扣第123题:买卖股票的最佳时机 III

我们定义dp[k][i]表示在第i天,最多进行k次交易(买入和卖出一组算作一次交易)所获得的最大利润。k = 0:表示没有交易,利润为 0。k = 1:表示进行一次交易,最大利润。k = 2:表示进行两次交易,最大利润。

weixin_48941116的博客 1209

买卖股票的最佳时机问题 C++

【题目描述】有一个价格数组prices,表示第i天的股票价格为prices[i],整个过程只能买入股票和卖出股票一次。并且买入股票必须再卖出股票之前。 【思路】贪心我们可以遍历一次数组,遍历到prices[i],表示在第i天卖出股票,为了使利益最大,我们需要在前i-1天中选择股票价格最低的一天买入。可以使用一个变量leftMin来记录前i-1天中,股票最低的价格。那么此时的最大利益就是prices[i]-leftMin。 动态规划dp[n][2]:dp[i][0]表示第i天未持有股票的最大利益,dp[i

2401_82677021的博客 1177

【力扣刷题实战】买卖股票的最佳时机II

文章目录目录力扣题目:买卖股票的最佳时机II题目描述解题思路问题理解算法选择解法一:双指针具体思路解题要点解法二:拆分成一天一天的具体思路解题要点完整代码(C++)解法一:双指针解法二:拆分成一天一天的收益累加起来 兄弟们共勉 !!! 每篇前言原题链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)给你一个整数数组 ,其中 表示某支股票第 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获

2401_85548793的博客 885
上一篇: leetcode 152:最大乘积子数组
下一篇: leetcode300:最长递增子序列
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值