• 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

    运行结果

    在这里插入图片描述

  • 相关阅读:
    距离Java大神还有多远
    Redis(7)----数据库与过期键
    基于OpenCV实现对图片及视频中感兴趣区域颜色识别
    问题记录|线上问题诊断大逃杀|docker环境中arthas启动不起来的问题解决
    鸿蒙HarmonyOS实战-Stage模型(进程模型)
    RSA加密算法Python实现
    解读AI机器人产业发展的顶层设计
    MySQL 全文索引
    mac、windows 电脑安装使用多个版本的node
    Day51 前端开发 浮动、定位 、js入门
  • 原文地址:https://blog.csdn.net/guxin_duyin/article/details/125419120