leetcode hot100 买卖股票最佳时机3

本题中,依旧可以采用动态规划来进行解决,之前的两个题我们都是用二维数组dpi2来表示的,其中i表示第i天,2表示长度为2,其中0表示不持有,1表示持有。

本题中,说至多完成两笔交易,也就是说我们可以买卖1次或者两次,然后获取价格最大的交易即可。所以说我们也还是要区分状态,只不过这次状态需要区分第一次第二次。

dpi0表示不操作,dpi1表示在第i天第一次持有,dpi2表示在第i天第一次不持有,dpi3表示第i天第二次持有,dpi4表示在第i天第二次不持有。

所以 递推公式如下

dpi1 = Math.max(dpi-11,-pricesi);

dpi2 = Math.max(dpi-12,dpi-11+pricesi);

dpi3 = Math.max(dpi-13,dpi-12-pricesi);

dpi4 = Math.max(dpi-14,dpi-13+pricesi);

dpi1表示第i天第一次持有,可能是前一天就已经持有了,也可能是前一天没持有,然后当天第1次买入(第一次买入所以是-pricesi)。

dpi2表示第i天第一次不持有,可能是前一天就已经不持有了,也可能是前一天持有,然后第i天卖出了。

dpi3表示第i天第二次持有,可能是前一天就已经是第二次持有了,也可能前一天第1次不持有,然后第i天买入

dpi4表示第i天第二次不持有,可能是前一天就第二次不持有了,也可能是前一天第二次持有,然后第i天卖出。

初始化:

dp00表示第0天没有操作,所以是0

dp01表示第0天,第一次持有,是-prices0

dp02表示第0天,第一次不持有,则是当天买然后当天卖 所以是0

dp03表示第0天,第二次持有,也就是第一次买完然后卖掉,再买,就是-prices0

dp04表示第0天,第二次不持有,就是第一次买完卖掉,当天再买再卖,所以是0

遍历顺序:

由前一天推出后一天的状态,所以应该是从前往后遍历

打印数组:我们最后打印的,一定是卖出股票的钱,所以就是dplen-12和dplen-14的最大值。

复制代码
// 版本一
class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        // 边界判断, 题目中 length >= 1, 所以可省去
        if (prices.length == 0) return 0;

        /*
         * 定义 5 种状态:
         * 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出
         */
        int[][] dp = new int[len][5];
        dp[0][1] = -prices[0];
        // 初始化第二次买入的状态是确保 最后结果是最多两次买卖的最大利润
        dp[0][3] = -prices[0];

        for (int i = 1; i < len; i++) {
            dp[i][1] = Math.max(dp[i - 1][1], -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];
    }
}
相关推荐
mmmmath_38 分钟前
LeetCode.101.对称二叉树
数据结构·leetcode
重生之小比特26 分钟前
【算法拾光】双指针|移动零 + 复写零
数据结构·c++·算法
梦帮科技1 小时前
Linux 内存取证学与 Rootkit 猎杀——Volatility 核心剖析与内核隐藏模块逆向清除
linux·运维·服务器·神经网络·算法·网络安全
广州智造1 小时前
Radioss二次开发需要准备什么?
人工智能·算法·机器学习·cad·cae
zx_741484812 小时前
YOLOv3 核心原理详解:Darknet-53 架构、多尺度预测与 FPN 特征融合
算法·yolo·目标检测·yolov3
MoRanzhi12032 小时前
122.四平方和(暴力枚举)
python·数学·算法·蓝桥杯·完全平方数·暴力枚举·四平方和定理
倒头就睡的小比特2 小时前
贪心算法介绍
算法·贪心算法
我命由我123452 小时前
动火作业极简理解
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·学习方法
万少2 小时前
Qoder sonus模型 20分钟,复刻 马斯克 飞天汽车
前端·后端·算法
七牛云行业应用3 小时前
Muse Spark Open 发布:Meta 称其为美国最强开放权重模型,816B 参数如何落地
算法