js算法买卖股票的最佳时机入门

这篇具有很好参考价值的文章主要介绍了js算法买卖股票的最佳时机入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

涉及力扣题目:
121.买卖股票的最佳时机
122.买卖股票的最佳时机II
123.买卖股票的最佳时机III
买卖股票是算法中动态规划专题里很经典的题目,它的难度包括简单到困难,但是它们的解题思路只要使用动态规划那就是一模一样没有区别,这也意味着掌握关键的算法套路很重要。

我们先来看一道入门题:

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

跟据前一天的收益获取今天的收益,很经典的动态规划套路。这是一道简单题对于回溯算法来解决确实是一道简单题,但是使用动态规划反而要更难这是因为,我们需要对其进行dp数组含义进行抽象这在动态规划中往往是最难的。

那我们开始进行第一也是最难的一步,创建一个二维数组,一维下标表示天数,二维下标为0就是表示要进行持有股票的操作,下标为2就是不持有股票操作,二维数组的大小就是收益。那么问题来了,假设我们知道前面天数的最大收益如何求当今收益,接下来就来到了推导公式,获取当今收益无非两种情况。1 今天啥也没做,直接就是前一天的收益dp[i-1]【0】(毕竟什么也不做也算是持有股票)或者直接买入一支新的股票0-prices[i]. 2 今天啥也不做dp[i-1][1],卖出股票dp[i-1][0]+proces[i].

对于初始化,就比较简单,直接假设当天的两种唯一情况。

dp[0] = [-prices[0], 0];

其余数组全设为0即可。

完整代码:文章来源地址https://www.toymoban.com/news/detail-812679.html

const maxProfit = prices => {
    const len = prices.length;
    // 创建dp数组
    const dp = new Array(len).fill([0, 0]);
    // dp数组初始化,一种是直接买股票,一种是不持有股票
    dp[0] = [-prices[0], 0];
    for (let i = 1; i < len; i++) {
        // 更新dp[i]
        dp[i] = [
            Math.max(dp[i - 1][0], -prices[i]),//持有股票的操作
            Math.max(dp[i - 1][1], prices[i] + dp[i - 1][0]),//不持有股票操作
        ];
    }
    return dp[len - 1][1];//最后减持股票肯定是最赚的,毕竟股票就是要套现的嘛
};

第二道题把题干变成了无限制次数,那么我们只需对购买股票的算法进行修改,变成前一天的收益减去购买股票的价格。

dp[i-1][0]-prices[i]

完整代码:

const maxProfit = (prices) => {
    let dp = Array.from(Array(prices.length), () => Array(2).fill(0));
    dp[0][0] = 0 - prices[0];
    dp[0][1] = 0;
    for(let i = 1; i < prices.length; i++) {
        dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i]);
        dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);
    }

    return dp[prices.length -1][1];
};

到这里大家可能会发现一种规律那就是当天的情况无非就是继承和买卖股票。其中继承就是继承前一天的财产,而买卖股票就是拿前一天的资产-+prices[i]。理解了这点接下来这道题就很简单了。

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

如果可以买卖两次那么今天就会有不止两种情况了,因为我们无法知道它是购买的第一支还是第二支股票。我们可以使用最简单的方法:枚举
假设五种情况:

  1. 无操作dp[i][0] = dp[i - 1][0];
  2. 第一次购买dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
  3. 第一次卖出dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
  4. 第二次购买 dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
  5. 第二次卖出 dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

完整代码:

const maxProfit = prices => {
    const len = prices.length;
    const dp = new Array(len).fill(0).map(x => new Array(5).fill(0));
    dp[0][1] = -prices[0];
    dp[0][3] = -prices[0];
    for (let i = 1; i < len; i++) {
        dp[i][0] = dp[i - 1][0];
        dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
        dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
        dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
        dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
    }
    return dp[len - 1][4];
};

到了这里,关于js算法买卖股票的最佳时机入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法刷题|121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ

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

    2023年04月26日
    浏览(41)
  • [思维]LeetCode:121.买卖股票的最佳时机

      题目链接:121. 买卖股票的最佳时机 - 力扣(Leetcode)   分析:这里的数据大小为1e5,所以使用暴力会TLE. 思路:我们发现, 需要找到最大利润,其目标就是找到当前第i位后的最大值。换位思考,就是找到当前第i位前的最小值。

    2023年04月09日
    浏览(59)
  • 力扣(Leetcode) 121. 买卖股票的最佳时机

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

    2024年01月25日
    浏览(42)
  • leetcode 188. 买卖股票的最佳时机 IV

            这道题是 买卖股票的最佳时机III  的升级版,即买卖次数限制为k次,做法和上一篇如法炮制,直接看代码:

    2024年02月12日
    浏览(36)
  • 【LeetCode】买卖股票的最佳时机含冷冻期

    链接: 买卖股票的最佳时机含冷冻期 题目描述 算法分析 程序设计

    2024年02月13日
    浏览(40)
  • leetcode 121. 买卖股票的最佳时机 (贪心 + 动规

    贪心的思路: 得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的 动规的思路: 现在觉得做动规的关键点就是找出,当前的状态是否与之前的状态有关,也就是说:当前一般会有两种状态,具体哪一种为最优,需要依靠之前的状态及逆行推导。 比如说本题

    2024年02月02日
    浏览(43)
  • LeetCode:121.买卖股票的最佳时机——动态规划

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 关于动态规划:LeetCode:322. 零钱兑换——动态规划从案例入门 题目描述 :给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只

    2023年04月17日
    浏览(39)
  • leetcode-188-买卖股票的最佳时机 IV

    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/

    2024年02月10日
    浏览(40)
  • LeetCode-题目整理【3】:买卖股票的最佳时机

    买卖股票的最佳时机 都是求最大利润,但是在没有限制,如121和122,动态规划稍微复杂一些,建议不用,到最后两道难题,题目有限制,使用动态规划通过求解子问题的最优解来逐步求解原问题的最优解。 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i]

    2024年01月23日
    浏览(61)
  • 【LeetCode】309. 买卖股票的最佳时机含冷冻期

    给定一个整数数组 prices ,其中第    prices[i]  表示第  i  天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意: 你不能同时参与

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包