• LeetCode 122. 买卖股票的最佳时机 II


    题目

    给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
    在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
    返回 你能获得的 最大 利润 。

    示例

    示例1

    输入:prices = [7,1,5,3,6,4]
    输出:7
    解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
    随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
    总利润为 4 + 3 = 7 。

    示例2

    输入:prices = [1,2,3,4,5]
    输出:4
    解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
    总利润为 4 。

    示例3

    输入:prices = [7,6,4,3,1]
    输出:0
    解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

    提示

    • 1 <= prices.length <= 3 * 104
    • 0 <= prices[i] <= 104

    题解

    思路

    动态规划
    考虑到「不能同时参与多笔交易」,因此每天交易结束后只可能存在手里有一支股票或者没有股票的状态。
    定义状态dp0表示第 i 天交易完后手里没有股票的最大利润
    定义状态dp1表示第 i 天交易完后手里持有一支股票的最大利润
    如果这一天交易完后手里没有股票,那么可能的转移状态为前一天已经没有股票;或者前一天结束的时候手里持有一支股票,这时候我们要将其卖出,并获得 \textit{prices}[i]prices[i] 的收益
    如果交易完后手里还有一支股票,那么可能的转移状态为前一天已经持有一支股票;前一天结束时还没有股票,这时候我们要将其买入

    代码实现

    /**
     * @param {number[]} prices
     * @return {number}
     */
    var maxProfit = function (prices) {
        const n = prices.length;
        let dp0 = 0, dp1 = -prices[0];
        for (let i = 1; i < n; ++i) {
            dp0 = Math.max(dp0, dp1 + prices[i]);
            dp1 = Math.max(dp1, dp0 - prices[i]);
        }
        return dp0;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果

    在这里插入图片描述

  • 相关阅读:
    挂载新的空间磁盘(解锁)
    HTML入门知识点
    【Linux】Centos 8 服务器部署:阿里云端口开放与应用实例教程
    Java中的类和对象 (二)
    一文彻底搞懂前端ES6模块化
    tomcat类加载-源码解析
    【06】基础知识:typescript中的泛型
    17.电话号码的字母组合
    4.4 文件管理
    selenium 定位不到元素的几种情况
  • 原文地址:https://blog.csdn.net/guxin_duyin/article/details/125419120