代码随想录训练营day50, 买卖股票的最佳时间III, IV

news/2024/7/17 4:38:17

买卖股票的最佳时间III

这里的关键就是至多买卖两次, 所以可以买一次, 买两次, 也可以不买卖

  1. dp数组含义. 一天有五个状态

    0 没有操作   1 第一次买入   2 第一次卖出   3 第二次买入   4 第二次卖出

dp[i][j]中, i表示第i天, j表示五种状态,

  1. 确定递推公式, 和之前的股票问题一样, 对于dp[i][1]两种情况:

    第i天买的: dp[i-1][0] - prices[i]

    沿用之前: dp[i - 1][1], 然后取max

    对于dp[i][2]: 第i天卖出: dp[i - 1][1] + prices[i]

    沿用之前: dp[i-1][2]

    然后同理: dp[i][3] = max(dp[i-1][3], dp[i-1][2]-prices[i]) do[i][4] = max(dp[i-1][4], dp[i-1][3] + prices[i])

  2. 初始化: 第0天没有操作, 所以是dp[0][0]=0, 第0天买入, 就是dp[0][1]=-prices[0], dp[0][2]=0, 因为没有利润, dp[0][3] = -prices[0], 只要买入现金就减少, dp[0][4]同样为0

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        if(len == 0 || prices == null){
            return 0;
        }

        int[][] dp = new int[len + 1][5];
        //inni, dp数组一开始就是0, 所以没必要定义下面的0
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        dp[0][2] = 0;
        dp[0][3] = -prices[0];
        dp[0][4] = 0;
        //开始遍历
        for(int i = 1; i < len; i++){
            //buy stock1: buy at that day/like before
            dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
            //sell stock1: sell at that day/like before
            dp[i][2] = Math.max(dp[i - 1][1] + prices[i], dp[i - 1][2]);
            //buy stock2: buy at that day/like before
            dp[i][3] = Math.max(dp[i - 1][2] - prices[i], dp[i - 1][3]);
            //sell stock2: sell that day/like befor
            dp[i][4] = Math.max(dp[i - 1][3] + prices[i], dp[i - 1][4]);
        }
        return dp[len - 1][4];
    }
}

买卖股票的最佳时机IV (最多完成k笔交易)

和之前的III相似, 但是这里有多种条件了, 可以发现偶数就是卖出, 奇数就是买入, 由于题目要求k笔交易, 所以j的范围就是2*k+1

这里的定义是dp[i][1]是买入股票的状态

递推公式: dp[i][1]状态有两种:

第i天买入, dp[i-1][0] - prices[i]

沿用之前, dp[i - 1][1]

同理dp[i][2]也有两种:

第i天卖出, dp[i-1][1] + prices[i]

沿用之前, dp[i - 1][2]

然后类比剩下的……

初始化: 可以发现是偶数是说明为卖出, 都为0; 为奇数时, 都为-pricesi

**细节:

  1. 首先初始化所有的奇数为-prices[0]

  2. 然后两个for循环, 把买入和卖出看成一个整体的操作, +=2

  3. 循环内, +1就是买的情况, +2就是卖的情况

class Solution {
    public int maxProfit(int k, int[] prices) {
        int len = prices.length;
        if(len == 0 || prices == null){
            return 0;
        }
        //由于最多有k次, 所以操作就是2k+1
        int[][] dp = new int[len + 1][2*k + 1];

        //初始化所有奇数, <2*k是因为从1开始的
        for(int j = 1; j < 2*k; j +=2){
            dp[0][j] = -prices[0];
        }
        //开始遍历, 把买入卖出看成单次
        for(int i = 1; i < len; i++){
            //这里是2k - 1, 因为条件有个j+2
            for(int j = 0; j < 2*k -1; j += 2){
                //分为奇数和偶数的情况
                //j+1表示奇数, 也就是买入
                dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
                dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
            }
        }
        //还记得上道题:卖2次就填4
        return dp[len - 1][k*2];
    }
}


http://lihuaxi.xjx100.cn/news/295598.html

相关文章

什么是虚拟dom,说一下react和vue的diff算法

什么是虚拟dom 组件第一次渲染的时候会生成一个虚拟dom和一个真实的dom然会会把真实的dom渲染到页面上 如果这个组件受到响应式数据变化的影响&#xff0c;需要重新渲染时&#xff0c;它仍然会重新调用render函数&#xff0c;创建一个新的虚拟dom树&#xff0c;这时会用新虚拟…

Microsoft SQL Server 图书管理数据库的建立

文章目录题目描述创建数据库使用数据库创建三个表外码的表示形式结果展示题目描述 – 新建 “图书管理数据库" – 其中包含三个关系 – 图书&#xff08;编号&#xff0c;图书名&#xff0c;作者&#xff0c;出版社&#xff0c;类型&#xff0c;单价&#xff09; – 借阅…

Ansys Zemax | 使用 OpticStudio 进行闪光激光雷达系统建模(中)

在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;但是 “闪光激光雷达” 解决方案通常都适用于在使用固态光学元件的目标场景中生成可检测的点阵列。凭借具有针对…

Linux NTP时间同步服务、NFS网络文件共享存储服务

目录 NTP服务 ntp服务器的安装 ntp时间同步的配置 同步性测试 ntpd和ntpdate的区别 国内常用的NTP服务器地址和IP NFS 服务 NFS原理图​编辑 NFS配置 nfs的优缺点 优点&#xff1a; 缺点&#xff1a; NTP服务 NTP服务器【Network Time Protocol&#xff08;NTP&#xff…

Python 利用4行代码实现图片灰度化

背景 不论是在进行深度学习时的图片处理&#xff0c;还是在商业用途出版书刊&#xff0c;基本都会用到对图片进行灰度转换&#xff0c;也就是灰度化&#xff0c;本文章利用简单的4行代码来快速实现图片灰度化&#xff0c;仅供参考 效果 实现代码 from PIL import Image wech…

代码随想录算法训练营第四十九天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

LeetCode 121. 买卖股票的最佳时机 链接&#xff1a;121. 买卖股票的最佳时机 思路&#xff1a; 这道题目用动规写起来效率其实是不如贪心的&#xff0c;但是对于解类似的题目还是有帮助&#xff0c;重点是理解动规的过程。首先定义下标&#xff1a;dp[i][0]表示第i天持有股…

Windows8系统下DOSBox编译、链接、执行汇编语言步骤

下载安装好DOSBox后&#xff0c;同时下载debug、link、masm程序。 &#xff08;1&#xff09;建立工作目录&#xff0c;编写汇编语言源文件&#xff0c;并将debug、link、masm程序放在同一目录下。&#xff08;下图中ass.asm是汇编语言源文件&#xff09; &#xff08;2&#x…

【学习笔记】深度学习入门:基于Python的理论与实现-误差反向传播法

CONTENTS五、误差反向传播法5.1 计算图5.2 链式法则5.3 反向传播5.4 简单层的实现5.5 激活函数层的实现5.6 Affine/Softmax层的实现5.7 误差反向传播法的实现五、误差反向传播法 5.1 计算图 先引入一个很简单的问题&#xff1a;在超市买了222个100100100元一个的苹果&#xf…