Day44:LeedCode 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

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

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

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

示例 2:

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

提示:

  • 1 <= k <= 100
  • 1 <= prices.length <= 1000
  • 0 <= prices[i] <= 1000

思路:

1.确定dp数组以及下标的含义

使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]

j的状态表示为:

0 表示不操作
1 第一次持有
2 第一次卖出
3 第二次持有入
4 第二次卖出
.....
题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了

2.确定递推公式

达到dp[i][1]状态,有两个具体操作:

1)操作一:第i天买入第一支股票了,那么dp[i][1] = dp[i-1][0] - prices[i]

2)操作二:第i天没有操作,而是沿用前一天买入第一支股票的状态,即:dp[i][1] = dp[i - 1][1]

达到dp[i][2]状态,有两个具体操作:

1)操作一:第i天卖出第一支股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]

2)操作二:第i天没有操作,沿用前一天卖出第一支股票的状态,即:dp[i][2] = dp[i - 1][2]

达到dp[i][3]状态,有两个具体操作:

dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);

达到dp[i][4]状态,有两个具体操作:

dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

........同理可以类比剩下的状态

if(i%2==1)

dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);//买入

if(i%2==0)

dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i]);//卖出

3.dp数组如何初始化

可以推出dp[0][j]当j为奇数的时候都初始化为 -prices[0]

4.确定遍历顺序

从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

5.举例

k=2,prices=[1,2,3,4]

代码参考:

class Solution {
    public int maxProfit(int k, int[] prices) {
  int[][] dp=new int[prices.length][2*k+1];
  //初始化
  for(int i=1;i<2*k+1;i=i+2){
   dp[0][i]=-prices[0];
  }
  for(int i=1;i<prices.length;i++){
for(int j=1;j<2*k+1;j++){
    //奇数买入
if( j%2==1){
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]-prices[i]);
}
    //偶数卖出
    if(j%2==0){
      dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]+prices[i]);
    }
}
  }
  return dp[prices.length-1][2*k];
    }
}

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

给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:

输入: prices = [1]
输出: 0

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

思路:

将交易状态化为四种

动态规划五部曲:

1.确定dp数组以及下标的含义

dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。

j=0:今天购入了股票/以前购买了股票还没卖出

j=1:今天卖出股票

j=2:冷冻期

j=3:今天没有股票在手,且不是今天卖出的股票

2.确定递推公式

dp[i][0]=max(dp[i-1][0],dp[i-1][3]-prices[i],dp[i-1][2]-prices[i])

dp[i][1]=dp[i-1][0]

dp[i][2]=dp[i-1][1]

dp[i-1][3]=max(dp[i-1][3],dp[i-1][2])

3.初始化

dp[0][0]=-prices[0]

dp[0][1]=0

dp[0][2]=0

dp[0][3]=0

4.遍历顺序

从递归公式上可以看出,dp[i] 依赖于 dp[i-1],所以是从前向后遍历。

5.举例

代码参考:

class Solution {
    public int maxProfit(int[] prices) {
  int[][] dp = new int[prices.length][4];
  //初始化
  dp[0][0]=0-prices[0];
  dp[0][1]=0;
  dp[0][2]=0;
  dp[0][3]=0;
  for(int i=1;i<prices.length;i++){
   dp[i][0]=Math.max(Math.max(dp[i-1][0],dp[i-1][2]-prices[i]),dp[i-1][3]-prices[i]);
   dp[i][1]=dp[i-1][0]+prices[i];
   dp[i][2]=dp[i-1][1];
   dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]);
  } 
  int n=prices.length;
  int result=Math.max(Math.max(dp[n-1][3],dp[n-1][2]),dp[n-1][1]);
  return result;    }
}


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

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:

输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:  
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:

输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

提示:

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

思路:

手续费相当于也是买股票的成本的一部分

动态规划五部曲:

1.确定dp数组以及下标的含义

dp[i][0],第i天状态为持有/购买股票,能够达到的最大利润

dp[i][1],第i天状态为不持有/卖出股票,能够达到的最大利润

2.确定递推公式

dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]-fee)

dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i])

3.初始化

dp[0][0]=-prices[0]-fee

dp[0][1]=0

4.遍历顺序

从递归公式上可以看出,dp[i] 依赖于 dp[i-1],所以是从前向后遍历。

5.举例

代码参考:

class Solution {
    public int maxProfit(int[] prices, int fee) {
    int[][] dp= new int[prices.length][2];
    //初始化
    dp[0][0]=0-prices[0];
    dp[0][1]=0;
    //
    for(int i=1;i<prices.length;i++){
        dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
        dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
    }
 return dp[prices.length-1][1];
    }
}

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

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

相关文章

无人机常见故障及维修方法详解

一、无人机故障识别与处理原则 无人机故障识别是维修的第一步&#xff0c;要求操作人员具备基本的无人机系统知识和故障识别能力。在识别故障时&#xff0c;应遵循“先易后难、先外后内、先软件后硬件”的原则。一旦识别出故障&#xff0c;应立即停止飞行&#xff0c;避免进一…

若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题

生成代码修改前 <el-form-item label"课程学科" prop"subject"><el-select v-model"queryParams.subject" placeholder"请选择课程学科" clearable><el-optionv-for"dict in course_subject":key"dict…

2024 年 6 月区块链游戏研报:Pixels 引发 DAU 波动,行业用户留存率差异显著

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;区块链游戏研究页面 2024 年 6 月&#xff0c;加密货币市场遭遇显著回调&#xff0c;比特币跌幅达 7.3%&#xff0c;以太坊更是下跌了 9.8%。此番波动不可避免地波及区块链游戏领域&#xff0c;导致…

深度学习每周学习总结N3(文本分类实战:基本分类(熟悉流程)、textCNN分类(通用模型)、Bert分类(模型进阶))

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结&#xff1a;1. 前期准备环境安装 2. 文本分类基本流程a. 加载数据b.构建词典c.生成数据批次和迭代器d.定义模型及实例e. 定义…

《C语言》认识数据类型和理解变量

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C语言基础 目录 前言 一、数据类型的介绍 1.1 字符型 1.2 整形 1.3 浮点型 1.4 布尔类型 1.5 各种数据类型的长度 1.5.1 sizeof操作符 1.5.2 数据类型长度…

免费代理 IP 如何泄露您的个人信息?

互联网时代&#xff0c;信息安全和隐私保护成为人们关注的焦点。很多用户出于各种需要&#xff0c;使用代理服务器浏览网页或进行其他网络活动&#xff0c;其中免费代理IP因其免费的特点而受到广泛青睐。然而&#xff0c;免费代理IP并不总是一个安全可靠的选择&#xff0c;它们…

opencv颜色识别,hsv采用滑块调节

识别效果如图所示&#xff0c;尽量排除了蓝色背景的干扰&#xff0c;hsv可用滑块进行调节&#xff0c;更加方便 import cv2 import numpy as np# 创建一个命名窗口&#xff0c;用于显示滑块 cv2.namedWindow("TrackBar")def nothing(x):pass# 创建滑块控件 cv2.cre…

Qt项目:基于Qt实现的网络聊天室---注册模块

文章目录 基本页面设计创建登录界面创建注册界面优化样式完善注册类界面 客户端逻辑完善客户端增加post逻辑客户端配置管理 邮箱注册服务认证服务读取配置邮箱验证服务联调设置验证码过期封装redis操作类封装redis连接池注册功能Server端接受注册请求封装mysql连接池封装DAO操作…

MySQL之备份与恢复(六)

备份与恢复 文件系统快照 先决条件和配置 创建一个快照的消耗几乎微不足道&#xff0c;但还是需要确保系统配置可以让你获取在备份瞬间的所有需要的文件的一致性副本。首先&#xff0c;确保系统满足下面这些条件。 1.所有的InnoDB文件(InnoDB的表空间文件和InnoDB的事务日志…

python语句前面有一个$是什么意思

“$”是汇编语言中的一个预定义符号&#xff0c;等价于当前正汇编到的段的当前偏移值。例如&#xff1a;指令“jmp $3”中的“$”表示当前这条指令在代码段中的偏移量。 代表当前指令的地址&#xff0c;如&#xff1a; data segment str1 db a,b,c,d leng equ $-str 就是当前地…

CompletableFuture工具类使用

CompletableFuture工具类可以帮助实现Java并发编程中的任务编排 以上除了join用于阻塞调用该发放的线程并且接受CompletableFuture的返回值以外其它方法皆有Async异步和Executor指定线程池选项 对于supply,run,apply,accept的区别在于函数式编程的接口类型不同: supply: Sup…

Linux配置固定ip地址

虚拟机的Linux操作系统&#xff0c;其IP地址是通过DHCP服务获取的 DHCP&#xff1a;动态获取IP地址&#xff0c;即每次重启设备后都会获取一次&#xff0c;可能导致IP地址频繁变更。 一般系统默认的ip地址设置都是自动获取&#xff0c;故每次系统重启后ip地址都可能会不一样&a…

PEFT - 安装及简单使用

LLM、AIGC、RAG 开发交流裙&#xff1a;377891973 文章目录 一、关于 PEFT二、安装1、使用 PyPI 安装2、使用源码安装 三、快速开始1、训练2、保存模型3、推理4、后续步骤 本文翻译整理自&#xff1a;https://huggingface.co/docs/peft/index 一、关于 PEFT &#x1f917;PEFT…

前端基础:JavaScript(篇一)

目录 JavaScript概述 JavaScript历史&#xff1a; 须知&#xff1a; 基本语法 变量 代码 运行 数据类型 1、数值型(number)&#xff1a; 代码 运行 2、布尔型(boolean)&#xff1a; 代码 运行 3、字符串型&#xff1a; 代码 运行 4、 undefined类型 代码…

Vue 邮箱登录界面

功能 模拟了纯前端的邮箱登录逻辑 还没有连接后端的发送邮件的服务 后续计划&#xff0c;再做一个邮箱、密码登录的界面 然后把这两个一块连接上后端 技术介绍 主要介绍绘制图形人机验证乃个 使用的是canvas&#xff0c;在源码里就有 界面控制主要就是用 表格、表单&#x…

Cookie的默认存储路径以及后端如何设置

问题场景 最近在写一个前后端分离的项目&#xff0c;需要跨域&#xff0c;前端开发同学遇到一个问题一直报错&#xff0c;本质上就是后端返回的cookie中的sessionID在前端发送http请求时无法被请求自动携带&#xff0c;每次htttpRequest都被后端识别为一个新的session&#xf…

Java传引用问题

本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况&#xff1a; 通过引用修改当前引用的指向 通过引用修改原来指…

IDEA 编译单个Java文件

文章目录 一、class文件的生成位置二、编译单个文件编译项目报错Error:java: 无效的源发行版: 8 一、class文件的生成位置 file->project structure->Modules 二、编译单个文件 选中文件&#xff0c;点击recompile 编译项目报错 Error:java: 无效的源发行版: 8 Fi…

谈大语言模型动态思维流程编排

尽管大语言模型已经呈现出了强大的威力&#xff0c;但是如何让它完美地完成一个大的问题&#xff0c;仍然是一个巨大的挑战。 需要精心地给予大模型许多的提示&#xff08;Prompt&#xff09;。对于一个复杂的应用场景&#xff0c;编写一套完整的&#xff0c;准确无误的提示&am…

【技术支持】console控制台输出美化(腾讯文档)

function style(color, size 12){return display:inline-block;background-color:${color};color:#fff;padding:2px 4px;font-size:${size}px; } const dataVersion 3.0.0 const codeVersion 3.0.28657969 const branchVersion release-20240617-f98487dc //注意此处%c后面…