首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端用动态规划玩股票 - 最终章

前端用动态规划玩股票 - 最终章

作者头像
LamHo
发布于 2022-09-26 02:44:44
发布于 2022-09-26 02:44:44
28900
代码可运行
举报
文章被收录于专栏:小前端看世界小前端看世界
运行总次数:0
代码可运行

这篇文章和你去买股票没有半毛钱关系,既然你进来了,就来看看前端算法呗,嘿嘿嘿嘿!

前端没有需要刷算法?

为什么需要做算法题?大家其实都有发现在这一段2020年开始,各大公司对于前端的面试中,都不同程度的加入了算法题的测试,其中让大家最有感悟的就是字节跳动的前端面试,加入了大量的算法考验,其中不乏有很多在LeetCode上的中等以及困难题目,我也在知乎上发起了一个提问。浏览量上百万,也得到了很多的评论。

为什么字节跳动的前端面试需要那么难的算法题?

经过看了很多的评论,也明白了前端刷算法题的重要性,经过一段时间刷LeetCode,让我深有的体会的并不是这些算法在前端领域当中是否真的用到,而是算法能提高自身对于问题的理解能力,以及解决问题的能力,在刷了100多题之后,重新的自己的审视,发现自己对于同样问题的思考方式有一定的改变,所以暂且得出的结论是,刷算法对于前端开发来说,主要是提升自己的思考能力,以及对问题的分析能力

本文概括

本文主要是讲述在LeetCode当中的股票类型题目使用动态规划的方式去解题的思路以及如何解题。

如果您已经做过,并深入理解,请阅读我的文章,看看我是否理解正确,如果你并没有做过该类题目,那么也可以阅读本文,先理解,然后关闭页面,打开LeetCode,尝试一下,挑战一下自己。


本篇文章是前端用动态规划玩股票的最终章,这次我们来挑战一下LeetCode中股票题目中的困难两题:

如果你并没有看过之前的两篇文章,建议先仔细阅读再看最终章。

Lam:前端用动态规划玩股票Lam:前端用动态规划玩股票II

买卖股票的组价时机III

分析:

这一题中,是基于第二题《买卖股票的最佳时机2》的基础上,加上了购买次数的限制。本题中限制了最多只能购买2次的限制,但是并非必须购买2次。所以我们可以想到第二次购买必须是第一次非持有股票的利润 - 今日股价来决定是否买入的。

解题:

因为这里涉及到了限制2次购买,所以一共有4个状态

  • 第一次 非持股
  • 第一次 持股
  • 第二次 非持股
  • 第二次 持股

在这里我们可以回顾一下第一题《买卖股票的最佳时机》时候我们的状态转移方程,因为只限制1次购买,与这里第一次持股的条件一样,并不存在累加利润的情况,只需要找到比当前持股成本更低和非持股的利润更高的状态即可,所以这里第一次买卖的状态转移方程就得出了。

  • 第一次 不持股利润 = max(第一次昨天不持股利润, 第一次昨天持股利润 + 今天价格)
  • 第一次 持股利润 = max(第一次昨天持股利润, 今天价格)

那么第二次买卖的状态转移方程怎么写呢?

首先我们要清楚,第二次购买肯定是在第一次购买后,所以第二次的持股条件应该是基于第一次非持股时的利润进行计算,所以得出第二次购买的状态转移方程。

  • 第二次 不持股利润 = max(第二次昨天不持股利润, 第二次昨天持股利润 + 今天价格)
  • 第二次 持股利润 = max(第二次昨天持股利润, 第一次不持股利润 - 今天价格)

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var maxProfit = function ( prices ) {

    if ( prices.length <= 1 ) return 0;
    if ( prices.length == 2 ) return Math.max( 0, prices[1] - prices[0] );

    const N = prices.length;

    // 第一次交易
    let dp_0_0 = 0; // 卖出后的利润
    let dp_0_1 = -prices[0]; // 买入后的利润

    // 第二次交易
    let dp_1_0 = 0; // 卖出后的利润
    let dp_1_1 = -prices[0]; // 买入后的利润

    for ( let i = 1; i < N; i++ ) {
        // 第二次卖出 根据当前买入后的利润 + 今日金额
        dp_1_0 = Math.max( dp_1_0, dp_1_1 + prices[i] );
        // 第二次买入,当前买入后的利润 是否大于 第一次买入后的利润 - 今日金额
        dp_1_1 = Math.max( dp_1_1, dp_0_0 - prices[i] );

        // 第一次买出,卖出条件是当前买入后利润+今日金额 是否大于 当前卖出的总利润
        dp_0_0 = Math.max( dp_0_0, dp_0_1 + prices[i] );
        // 都一次买入,判断是否有更低的买入价
        dp_0_1 = Math.max( dp_0_1, -prices[i] );
        
    }

    return dp_1_0;
}

买卖股票的组价时机IV

分析:

最后一题和上一题其实是一样,只是将限制购买2次变为n次。

解题:

所以状态转移方程是和上一题一样的,但是有一些不一样,就是需要区分是否为第一次买卖。

  • 第一次 不持股利润 = max(第一次昨天不持股利润, 第一次昨天持股利润 + 今天价格)
  • 第一次 持股利润 = max(第一次昨天持股利润, 今天价格)
  • 第n次 不持股利润 = max(第n次昨天不持股利润, 第n次昨天持股利润 + 今天价格)
  • 第n次 持股利润 = max(第n次昨天持股利润, 第n-1次不持股利润 - 今天价格)

在编写代码的时候就需要留意了,在这一题中,我们就不能去维了,因为购买的次数的n次,所以我们就需要dp数组来记录每一次的买卖记录了。

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var maxProfit = function(k, prices) {

    const N = prices.length;

    if (N <= 1 || k < 1) return 0;


    // 当限定的购买天数大于可购买天数的一半,可以视为没有任何限制
    if ( k > N / 2 ) {

        let dp_i_0 = 0;
        let dp_i_1 = -prices[0];

        for ( let i = 1; i < N; i++ ) {
            const temp = dp_i_0;
            dp_i_0 = Math.max( dp_i_0, dp_i_1 + prices[i] );
            dp_i_1 = Math.max( dp_i_1, temp - prices[i] );
        }

        return dp_i_0;
    }


    // 不确定传入的限制次数是多少,所以不能进行降维处理
    // 构建dp;
    const dp = [];
    for ( let i = 0; i < N; i++ ) {
        
        dp[i] = [];

        for ( let n = 0; n < k; n++ ) {
            if ( i == 0 ) {
                dp[i][n] = [0, -prices[0]]
            } else {
                dp[i][n] = [0,0];
            }
        }

    }
    
    // 循环天数
    for ( let i = 1; i < N; i++ ) {
        // 循环限制购买次数,倒序
        for ( let n = k - 1; n >= 0; n-- ) {
            // 需要区分第一次买卖还是非第一次买卖
            dp[i][n][0] = Math.max( dp[i-1][n][0], dp[i-1][n][1] + prices[i] );
            dp[i][n][1] = Math.max( dp[i-1][n][1], n == 0 ? -prices[i] : dp[i-1][n-1][0] - prices[i] );

        }

    }

    return dp[N-1][k-1][0];
};

总结

以上就是所有股票的题目解法,其实只要知道第一第二题的状态转移方程,其实就比较好得出后面的其他买卖条件下的状态转移方程了。

经过这几题股票题目,可以大概了解到动态规划的大概是使用方式,动态规划在很多大厂都有不少的面试题,主要是因为动态规划考验的并非具体的算法如何编写,而是背后的对问题的分析能力,以及如何将问题分解成小问题最终得出状态转移方程。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Transformers 4.37 中文文档(十六)
所有模型的输出都是 ModelOutput 的子类实例。这些是包含模型返回的所有信息的数据结构,但也可以用作元组或字典。
ApacheCN_飞龙
2024/06/26
6820
Transformers 4.37 中文文档(二十一)
Bart 模型是由 Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman Mohamed, Omer Levy, Ves Stoyanov 和 Luke Zettlemoyer 在 2019 年 10 月 29 日提出的,题为 BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension。
ApacheCN_飞龙
2024/06/26
3020
Transformers 4.37 中文文档(二十五)
请注意,BlenderbotSmallModel 和 BlenderbotSmallForConditionalGeneration 仅与检查点facebook/blenderbot-90M结合使用。较大的 Blenderbot 检查点应该与 BlenderbotModel 和 BlenderbotForConditionalGeneration 一起使用
ApacheCN_飞龙
2024/06/26
2580
Transformers 4.37 中文文档(五十九)
SwitchTransformers 模型是由 William Fedus、Barret Zoph 和 Noam Shazeer 在Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity中提出的。
ApacheCN_飞龙
2024/06/26
7950
Transformers 4.37 中文文档(二十四)
BigBird 模型是由 Zaheer, Manzil 和 Guruganesh, Guru 以及 Dubey, Kumar Avinava 和 Ainslie, Joshua 和 Alberti, Chris 和 Ontanon, Santiago 和 Pham, Philip 和 Ravula, Anirudh 和 Wang, Qifan 和 Yang, Li 等人在Big Bird: Transformers for Longer Sequences中提出的。BigBird 是一种基于稀疏注意力的 Transformer,它将 Transformer 模型(如 BERT)扩展到更长的序列。除了稀疏注意力,BigBird 还将全局注意力以及随机注意力应用于输入序列。从理论上讲,已经证明应用稀疏、全局和随机注意力可以逼近全注意力,同时对于更长的序列来说在计算上更加高效。由于具有处理更长上下文的能力,BigBird 在各种长文档 NLP 任务上表现出比 BERT 或 RoBERTa 更好的性能,如问答和摘要。
ApacheCN_飞龙
2024/06/26
2190
Transformers 4.37 中文文档(三十七)
OpenAI GPT-2 模型是由 Alec Radford、Jeffrey Wu、Rewon Child、David Luan、Dario Amodei 和 Ilya Sutskever 在 OpenAI 提出的,它是一个因果(单向)变压器,使用语言建模在一个大约 40GB 的文本数据语料库上进行预训练。
ApacheCN_飞龙
2024/06/26
2530
Transformers 4.37 中文文档(五十六)
RoBERTa-PreLayerNorm 模型由 Myle Ott, Sergey Edunov, Alexei Baevski, Angela Fan, Sam Gross, Nathan Ng, David Grangier, Michael Auli 在 fairseq: A Fast, Extensible Toolkit for Sequence Modeling 中提出。它与在 fairseq 中使用 --encoder-normalize-before 标志相同。
ApacheCN_飞龙
2024/06/26
2730
Transformers 4.37 中文文档(八十一)
Whisper 模型由 Alec Radford、Jong Wook Kim、Tao Xu、Greg Brockman、Christine McLeavey、Ilya Sutskever 在通过大规模弱监督实现稳健语音识别中提出。
ApacheCN_飞龙
2024/06/26
1.2K0
Transformers 4.37 中文文档(六十二)
**免责声明:**如果您看到异常情况,请提交GitHub 问题并指定@patrickvonplaten
ApacheCN_飞龙
2024/06/26
3810
Transformers 4.37 中文文档(五十五)
如果您在运行此模型时遇到任何问题,请重新安装支持此模型的最后一个版本:v4.30.0。您可以通过运行以下命令来执行:pip install -U transformers==4.30.0。
ApacheCN_飞龙
2024/06/26
4380
Transformers 4.37 中文文档(四十二)
M2M100 模型是由 Angela Fan、Shruti Bhosale、Holger Schwenk、Zhiyi Ma、Ahmed El-Kishky、Siddharth Goyal、Mandeep Baines、Onur Celebi、Guillaume Wenzek、Vishrav Chaudhary、Naman Goyal、Tom Birch、Vitaliy Liptchinsky、Sergey Edunov、Edouard Grave、Michael Auli、Armand Joulin 在 Beyond English-Centric Multilingual Machine Translation 中提出的。
ApacheCN_飞龙
2024/06/26
5070
Transformers 4.37 中文文档(四十二)
Transformers 4.37 中文文档(三十六)
我们介绍了 GPT-NeoX-20B,这是一个拥有 200 亿参数的自回归语言模型,经过 Pile 训练,其权重将通过宽松许可证免费向公众开放。据我们所知,这是在提交时具有公开可用权重的最大稠密自回归模型。在这项工作中,我们描述了 GPT-NeoX-20B 的架构和训练,并评估了其在一系列语言理解、数学和基于知识的任务上的性能。我们发现,GPT-NeoX-20B 是一个特别强大的少样本推理器,在进行五次评估时性能提升明显,而与大小相似的 GPT-3 和 FairSeq 模型相比。我们开源了训练和评估代码,以及模型权重,链接为 github.com/EleutherAI/gpt-neox。
ApacheCN_飞龙
2024/06/26
5460
Transformers 4.37 中文文档(三十六)
Transformers 4.37 中文文档(二十二)
BARThez 模型是由 Moussa Kamal Eddine、Antoine J.-P. Tixier 和 Michalis Vazirgiannis 于 2020 年 10 月 23 日提出的BARThez: a Skilled Pretrained French Sequence-to-Sequence Model。
ApacheCN_飞龙
2024/06/26
3960
Transformers 4.37 中文文档(五十七)
RoCBert 模型是由 HuiSu、WeiweiShi、XiaoyuShen、XiaoZhou、TuoJi、JiaruiFang、JieZhou 在 RoCBert: Robust Chinese Bert with Multimodal Contrastive Pretraining 中提出的。它是一个经过预训练的中文语言模型,在各种形式的对抗攻击下具有鲁棒性。
ApacheCN_飞龙
2024/06/26
3640
Transformers 4.37 中文文档(三十一)
EncoderDecoderModel 可以用于初始化一个序列到序列模型,其中预训练的自编码模型作为编码器,预训练的自回归模型作为解码器。
ApacheCN_飞龙
2024/06/26
4020
Transformers 4.37 中文文档(九十六)
VipLlava 模型是由 Mu Cai、Haotian Liu、Siva Karthik Mustikovela、Gregory P. Meyer、Yuning Chai、Dennis Park、Yong Jae Lee 在《Making Large Multimodal Models Understand Arbitrary Visual Prompts》中提出的。
ApacheCN_飞龙
2024/06/26
5920
Transformers 4.37 中文文档(六十一)
X-MOD 模型是由 Jonas Pfeiffer、Naman Goyal、Xi Lin、Xian Li、James Cross、Sebastian Riedel 和 Mikel Artetxe 在Lifting the Curse of Multilinguality by Pre-training Modular Transformers中提出的。X-MOD 扩展了多语言掩码语言模型,如 XLM-R,在预训练期间包含特定于语言的模块化组件(语言适配器)。在微调中,每个 Transformer 层中的语言适配器被冻结。
ApacheCN_飞龙
2024/06/26
4750
Transformers 4.37 中文文档(四十一)
LongT5 模型是由 Mandy Guo、Joshua Ainslie、David Uthus、Santiago Ontanon、Jianmo Ni、Yun-Hsuan Sung 和 Yinfei Yang 在LongT5: Efficient Text-To-Text Transformer for Long Sequences中提出的。它是在文本到文本去噪生成设置中预训练的编码器-解码器变压器。LongT5 模型是 T5 模型的扩展,它可以使用两种不同的高效注意力机制之一——(1)局部注意力,或(2)瞬时全局注意力。
ApacheCN_飞龙
2024/06/26
2610
Transformers 4.37 中文文档(九十四)
SpeechEncoderDecoderModel 可用于使用任何预训练语音自编码模型作为编码器(例如 Wav2Vec2,Hubert)和任何预训练自回归模型作为解码器初始化语音到文本模型。
ApacheCN_飞龙
2024/06/26
4540
Transformers 4.37 中文文档(九十四)
Transformers 4.37 中文文档(四十)
Hugo Touvron、Thibaut Lavril、Gautier Izacard、Xavier Martinet、Marie-Anne Lachaux、Timothée Lacroix、Baptiste Rozière、Naman Goyal、Eric Hambro、Faisal Azhar、Aurelien Rodriguez、Armand Joulin、Edouard Grave、Guillaume Lample 在LLaMA: Open and Efficient Foundation Language Models中提出了 LLaMA 模型。它是一个包含从 7B 到 65B 参数的基础语言模型的集合。
ApacheCN_飞龙
2024/06/26
7690
相关推荐
Transformers 4.37 中文文档(十六)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档