代码随想录算法训练营第四十四天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

188.买卖股票的最佳时机IV

在这里插入图片描述

题目链接:188.买卖股票的最佳时机IV
文档讲解:代码随想录
状态:不会

思路:
在股票买卖1使用一维dp的基础上,升级成二维的即可。

  1. 定义dp[k+1][2],其中 dp[j][0] 表示第j次交易后持有股票的最大利润,dp[j][1] 表示第j次交易后不持有股票的最大利润。
  2. 初始化时,对所有持有股票的情况要变成dp[i][0] = -prices[0];

题解:
要注意: dp[j][0] = Math.max(dp[j][0], dp[j - 1][1] - prices[i]);
dp[j - 1][1] - prices[i] 是因为买入股票的操作要用dp[j-1][1],也就是上次卖出去得到的钱来买这次的股票

    public int maxProfit(int k, int[] prices) {
        // 特殊情况处理,如果价格数组为空或只有一个元素,返回0
        if (prices.length == 0) return 0;

        // dp数组定义为k+1行,2列
        // dp[j][0] 表示第j次交易后持有股票的最大利润
        // dp[j][1] 表示第j次交易后不持有股票的最大利润
        int[][] dp = new int[k + 1][2];

        // 初始化第1到第k次交易后的持有股票的最大利润为 -prices[0]
        for (int i = 1; i <= k; i++) {
            dp[i][0] = -prices[0];
        }

        // 遍历每一天的股票价格
        for (int i = 1; i < prices.length; i++) {
            // 倒序遍历每一次交易,也可以正序,但是倒序更快一点
            for (int j = k; j >= 1; j--) {
                // 更新第j次交易后不持有股票的最大利润
                dp[j][1] = Math.max(dp[j][1], dp[j][0] + prices[i]);
                // 更新第j次交易后持有股票的最大利润
                // dp[j - 1][1] - prices[i] 是因为买入股票的操作要用dp[j-1][1],也就是上次卖出去得到的钱来买这次的股票
                dp[j][0] = Math.max(dp[j][0], dp[j - 1][1] - prices[i]);
            }
        }

        // 返回最多k次交易后不持有股票的最大利润
        return dp[k][1];
    }

309.最佳买卖股票时机含冷冻期

在这里插入图片描述

题目链接:309.最佳买卖股票时机含冷冻期
文档讲解:代码随想录
状态:不会

思路:

第i天的最大收益由持有和不持有股票两种状态推导出来,考虑到由冷冻期,那么第i天持有股票可以考虑跳过昨天,从前天推导。

假设有今天持股情况下的最大收益 dp[i][0]、昨天不持股的最大收益 dp[i−1][0]、昨天持股的最大收益 dp[i−1][0]、前天不持股的最大收益 dp[i−2][1],前天持股的最大收益 dp[i−2][0]。先将目光集中在前天,分别考虑前天持股与不持股的情况,试试能不能推导出今天的最大收益。

对于 dp[i−2][0] 来说,它表示前天结束时手中还有股票,那么如果昨天选择将前天的股票卖掉,由于冷冻期的存在,今天是不能交易的,自然今天手中也不可能还有股票,推导不出 dp[i][0],因此这种情况可以直接忽略;如果前天选择保留股票到昨天,昨天也只能继续保留股票才能让今天手中也有股票,这时 dp[i][0]=dp[i−1][0],这种情况已经在上面的状态转移方程中考虑到了,因此也不用担心。
对于 dp[i−2][1] 来说,它表示前天结束时手中没有股票,如果昨天买入股票,只能是将股票保留到今天才能推出 dp[i][0],这时 dp[i]=dp[i−1][0] 在状态转移方程中已经考虑到了;如果昨天不买入股票,那么由于昨天手中没有股票,只能是今天买入,同时因为昨天没交易,昨天的最大收益和前天相同 dp[i−1][1]=dp[i−2][1],所以这种情况的最大收益是 dp[i−2][1]−prices[i]。

题解:

   public int maxProfit(int[] prices) {
        int n = prices.length;

        // 如果价格数组长度为0,直接返回0
        if (n == 0) {
            return 0;
        }

        // 定义一个二维数组 dp,dp[i][0] 表示第 i 天持有股票的最大利润,
        // dp[i][1] 表示第 i 天不持有股票的最大利润
        int[][] dp = new int[n + 1][2];

        // 初始化第一天的状态
        dp[1][0] = -prices[0]; // 第一天持有股票,利润为负的当前股票价格

        // 从第二天开始遍历价格数组
        for (int i = 2; i <= n; i++) {
            // 第 i 天持有股票的最大利润,可以选择前一天也持有股票,或者前两天不持有股票,今天买入
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 2][1] - prices[i - 1]);

            // 第 i 天不持有股票的最大利润,可以选择前一天也不持有股票,或者前一天持有股票,今天卖出
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i - 1]);
        }

        // 返回倒数第二天不持有股票的最大利润
        return dp[n][1]; // 因为是倒数第二天,所以这里改为 dp[n][1]
    }

714.买卖股票的最佳时机含手续费

在这里插入图片描述

题目链接:714.买卖股票的最佳时机含手续费
文档讲解:代码随想录
状态:终于做出来一道了。。。。

思路:和股票买卖第2道题一样,不过每次卖出的时候扣除手续费就好了。

题解:

public int maxProfit(int[] prices, int fee) {
    if (prices.length == 1) {
        return 0;
    }
    int hasStock = -prices[0]; // 第一天买入股票后的收益
    int noStock = 0; // 第一天不买股票的收益
    for (int i = 1; i < prices.length; i++) {
        // 今天选择买入股票或者保持昨天持有股票的状态
        hasStock = Math.max(hasStock, noStock - prices[i]);
        // 今天选择卖出股票或者保持昨天没有股票的状态
        noStock = Math.max(noStock, hasStock + prices[i] - fee);
    }
    return noStock; // 最后一天不持有股票的最大收益
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/774714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Cadence18】如何放置定位孔

在菜单的place->manually会出现Placement对话框&#xff0c; 在Advanced settings中勾选database和library 然后点击Placement list&#xff0c;下拉框中选择Mechanical symbols,勾选你要的定位孔 &#xff08;如下图的HOLE_1_6R00D2R70-PTH&#xff0c;注意&#xff1a;…

相关技术 检测离型纸

网盘 https://pan.baidu.com/s/1W-k4hl9uhjAG98hqJG11ug?pwdcrpn 离型无纺布.pdf 离型纸剥离机构.pdf 离型纸处理装置及贴胶设备.pdf 离型纸收集机构.pdf 离型纸涂布装置.pdf 防伪印刷离型纸的制造工艺.pdf

gitee代码初次上传步骤

ps. 前提是已经下载安装gitee 一、在本地项目目录下空白处右击&#xff0c;选择“Git Bash Here” 二、初始化 git init 三、添加、提交代码&#xff08;注意add与点之间的空格&#xff09; git add . git commit -m 添加注释 四、连接、推送到gitee仓库 git remote add …

E2.【C语言】练习:static部分

#include <stdio.h> int sum(int a) {int c 0;static int b 3;c 1;b 2;return (a b c); } int main() {int i;int a 2;for (i 0; i < 5;i){printf("%d ", sum(a));} } 求执行结果 c是auto类变量(普通的局部变量)&#xff0c;自动产生&#xff0c…

一个项目学习Vue3---Class和Style绑定

看下面一段代码学习此部分内容 <template><button click"stateChang">状态切换</button><div :class"{font-color:classObject.openColor,font-weight:classObject.openWeight}">颜色和粗细变化</div><div :class"…

Java中使用arima预测未来数据

看着已经存在的曲线图数据&#xff0c;想预估下后面曲线图的数据。 import java.util.Vector;public class AR {double[] stdoriginalData{};int p;ARMAMath armamathnew ARMAMath();/*** AR模型* param stdoriginalData* param p //p为MA模型阶数*/public AR(double [] stdori…

通证经济重塑经济格局

在数字化转型的全球浪潮中&#xff0c;通证经济模式犹如一股新兴力量&#xff0c;以其独特的价值传递与共享机制&#xff0c;重塑着经济格局&#xff0c;引领我们步入数字经济的新纪元。 通证&#xff0c;作为这一模式的核心&#xff0c;不仅是权利与权益的数字化凭证&#xf…

Netty学习(NIO基础)

NIO基础 三大组件 Channel and Buffer 常用的只有ByteBuffer Selector&#xff08;选择器&#xff09; 结合服务器的设计演化来理解Selector 多线程版设计 最早在nio设计出现前服务端程序的设计是多线程版设计,即一个客户端对应一个socket连接,一个连接用一个线程处理,每…

静力水准仪:测量与安装的全面指南

静力水准仪作为一种高精度的测量仪器&#xff0c;广泛应用于管廊、大坝、核电站、高层建筑、基坑、隧道、桥梁、地铁等工程领域&#xff0c;用于监测垂直位移和倾斜变化。本文将详细介绍静力水准仪的工作原理、特点及其安装过程中的注意事项&#xff0c;旨在为相关工程人员提供…

字符串函数5-9题(30 天 Pandas 挑战)

字符串函数 1. 相关知识点1.5 字符串的长度条件判断1.6 apply映射操作1.7 python大小写转换1.8 正则表达式匹配2.9 包含字符串查询 2. 题目2.5 无效的推文2.6 计算特殊奖金2.7 修复表中的名字2.8 查找拥有有效邮箱的用户2.9 患某种疾病的患者 1. 相关知识点 1.5 字符串的长度条…

3dmax全景图用什么渲染软件好?渲染100邀请码1a12

全景图是常见的效果图类型&#xff0c;常用于展示大型空间&#xff0c;如展厅、会议室等。全景图的制作需要渲染&#xff0c;下面我介绍几个常用的渲染软件分享给大家。 1、V-Ray&#xff1a;十分流行的渲染引擎&#xff0c;功能强大&#xff0c;它提供了高质量的光线追踪技术…

【CUDA】 矩阵乘法 matMatMul

矩阵乘法 matMatMul 矩阵乘法是基本线性代数子程序&#xff08;BLAS&#xff09;的重要组成部分&#xff0c;而且线性代数中许多其他操作以此为基础。 图1是两个矩阵的乘法。 基础方法&#xff0c;正方形tile和长方形tile 基础方法 执行矩阵乘法的基础方法是使用单个线程执…

如何学习和提升SQL

资料来源于腾讯技术直播&#xff0c;只作为学习记录&#xff0c;如有侵权&#xff0c;请联系作者进行删除

JUC并发编程基础(包含线程概念,状态等具体实现)

一.JUC并发编程基础 1. 并行与并发 1.1 并发: 是在同一实体上的多个事件是在一台处理器上"同时处理多个任务"同一时刻,其实是只有一个事件在发生. 即多个线程抢占同一个资源. 1.2 并行 是在不同实体上的多个事件是在多台处理器上同时处理多个任务同一时刻,大家…

【码银送书第二十二期】《Python数据分析从入门到精通(第2版)》

&#x1f490;大家好&#xff01;我是码银~&#xff0c;欢迎关注&#x1f490;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 前言 &#x1f340;丛书说明&#xff1a;“软件开发视频大讲堂‘’丛书第1版于2008年8月出版&#xff0c;因其编写细腻、易学实用…

ython 使用 cx_Freeze 打包,不想要打包文件中能直接看到依赖的代码,如何处理

背景&#xff1a;因为使用 cx_Freeze 打包时&#xff0c;添加需要依赖的文件 cx_Freeze 是一个用于将 Python 程序打包成独立可执行文件的工具&#xff0c;支持多个平台。当你需要打包包含多个 .py 文件的项目时&#xff0c;你可以通过编写一个 setup.py 文件来指定哪些模块应…

免杀笔记 ----> ShellCode Loader !!!

学了那么久的前置知识&#xff0c;终于到了能上线的地方了&#xff01;&#xff01;&#xff01; 不过这里还没到免杀的部分&#xff0c;距离bypass一众的杀毒软件还有很长的路要走&#xff01;&#xff01; 目录 1.ShellCode 2.ShellCode Loader的概念 3.可读可写可…

【邀请函】相约CommunityOverCode Asia 2024,共探Flink、Paimon、Celeborn开源新境界!

CommunityOverCode是由Apache软件基金会&#xff08;ASF&#xff09;主办的一系列全球性会议&#xff0c;旨在促进开源技术的发展和社区参与。自1998年以来&#xff0c;ApacheCon一直是这一系列活动的核心&#xff0c;吸引了不同背景和技术层级的参与者&#xff0c;关注于“明天…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权&#xff0c;当最后⼀个指涉到该对象的shared_ptr不再指向他时&#xff0c;shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个&#xff1f;《引⽤计数》 shared_ptr构造函数&#xff0c;使引⽤计数析构函数&…

应用了网络变压器的PC网卡连接转换器后不好连网,有掉线现象,但外接路由器无问题,可能是什么原因?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是应用了网络变压器的PC网卡连接转换器后不好连网&#xff0c;有掉线现象&#xff0c;但外接路由器无问题&#xff0c;可能是什么原因呢&#xff1f;如何解决呢&#xff1f; 首先&#xff0c;我们要了解传…