LeetCode刷题 | 309. 最佳买卖股票时机含冷冻期、714. 买卖股票的最佳时机含手续费

news2024/11/18 23:40:22

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

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

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

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

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

示例 1:

输入: prices = [1,2,3,0,2]

输出: 3

解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:

输入: prices = [1]

输出: 0

动归五部曲:

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

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

j的状态为:

  • 0:状态一,持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
  • 1:状态二,保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
  • 2:状态三,今天卖出股票
  • 3:状态四,今天为冷冻期状态,但冷冻期状态不可持续,只有一天

2. 确定递推公式

  • 达到买入股票状态(状态一)即:dp[i][0],有两个具体操作
    • 操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]
    • 操作二:今天买入了,有两种情况
      • 前一天是冷冻期(状态四),dp[i - 1][3] - prices[i]
      • 前一天是保持卖出股票的状态(状态二),dp[i - 1][1] - prices[i]
    • 此时dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);
  • 达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:
    • 操作一:前一天就是状态二
    • 操作二:前一天是冷冻期(状态四)
    • 此时dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
  • 达到今天就卖出股票状态(状态三),即:dp[i][2] ,只有一个操作:
    • 昨天一定是持有股票状态(状态一),今天卖出
    • 此时dp[i][2] = dp[i - 1][0] + prices[i];
  • 达到冷冻期状态(状态四),即:dp[i][3],只有一个操作:
    • 昨天卖出了股票(状态三)
    • 此时dp[i][3] = dp[i - 1][2];

3. dp数组初始化

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

dp[0][1] = 0;

dp[0][2] = 0;

dp[0][2] = 0;

4. 遍历顺序

从前往后遍历

5. 举例推导dp数组

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

       // 0为卖出或不操作 1为买入
       dp[0][0] = 0;
       dp[0][1] = -prices[0];
       dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]);
       // 第一天买入 说明第0天一定没有卖出 所以比较第0天买入和第一天买入中的较大值
       dp[1][1] = Math.max(dp[0][1], -prices[1]);

       for(int i = 2;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 - 2][0] - prices[i]);
       }
        return dp[prices.length - 1][0];
    }
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL学习笔记】(四)MySQL数据类型

MySQL数据类型 1 数据类型分类2 数值类型2.1 tinyint 类型2.2 bit 类型2.3 小数类型2.4 字符串类型2.5 varchar2.6 char和varchar比较 2.6 日期和时间类型2.6 enum 和 set2.6.1 集合查询使用find_ in_ set函数 1 数据类型分类 2 数值类型 2.1 tinyint 类型 数值测试 mysql>…

基于IP 的 Nginx 虚拟主机

目录 一、配置文件&#xff08;不要忘了备份&#xff09; 二、 访问地址 一、配置文件&#xff08;不要忘了备份&#xff09; 二、 访问地址

while(1) 和 for ( ; ; )的区别

while(1) 和 for(;;) 它们不都是无限循环吗&#xff0c;作用应该一样啊&#xff0c;它们到底有什么区别&#xff1f; 要回答这个问题&#xff0c;其实你各自编写一段while(1) 和 for(;;)的代码&#xff0c;编译对比一下代码大小和汇编文件&#xff0c;你就大概知道了。 while(…

Vue.extend

Vue.extend 方法用来对基本的Vue组件进行扩展&#xff0c;&#xff0c;创建他的子类&#xff0c;&#xff0c;通过扩展根节点Vue定义新的组件 const BaseComponent Vue.extend({data(){return{message:"hehe"}}})const ExtendedComponent BaseComponent.extend({mo…

5、Redis持久化

RDB&#xff08;默认&#xff09; 在指定的时间间隔&#xff0c;执行数据集的时间点快照 在指定的时间间隔&#xff0c;执行数据集的时间点快照 实现类似照片记录效果的方式&#xff0c;就是把某一时刻的数据和状态以文件的形式写到磁盘上&#xff0c;也就是快照。这样一来即使…

Mars3d实现对图层树顺序进行了调整的同时调整图层的层级

问题&#xff1a; 1.这个图层管理中的移动图层只是移动在树里的显示关系&#xff0c;数据的叠加优先级没有同步修改 原因&#xff1a; 1. 只对同类型图层才有效&#xff0c;如果是矢量图层需要zIndex的才有效。 比如&#xff1a;都是 geoserver发布的wms图层&#xff0c;这种…

六月喜报 | 震坤行荣获多项行业大奖!

六月喜报 | 震坤行荣获多项行业大奖&#xff01; 六月&#xff0c;震坤行先后荣获上海市工商联工业品服务商会行业五大奖项&#xff0c;以及SiMPL2023第十三届供应链年度中国供应链数字化创新先锋。一路荣誉加冕&#xff0c;蓄势前行&#xff0c;揽获多个行业奖项。 6月1日&am…

局域网远程连接

一根网线连接两台电脑 前言步骤1 设置B“允许远程连接”2 A和B必须在同一个网段下面3 “winr”&#xff0c;输入“mstsc”中4 弹出“远程桌面连接”窗口&#xff0c;输入B的ip地址和B电脑的用户名及密码&#xff08;winL键锁屏&#xff0c;看看B的用户名和密码是什么&#xff0…

python学习——函数

一、函数的定义 函数就是执行特定任务和完成特定功能的一段代码。使用函数可以对代码进行复用&#xff0c;提高代码的可维护性和可读性&#xff0c;使得程序便于调试。 二、函数的创建 创建格式 #创建和格式 def 函数名&#xff08;[参数]&#xff09;:函数体[return xxx]举例…

h5实现下拉选择

一、先看效果图 二、简单实现一下代码 首先你要引入jQuery.js文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name…

Vue基础 el挂载点、data数据对象

第一步导入vue&#xff0c;第二步在html里面写一点东西&#xff0c;第三步在js里面写一点东西。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title><link href"" type"text/css"…

开发小程序为什么会成为餐饮行业的新趋势

在过去的一段时间里&#xff0c;小程序的发展可谓是如火如荼。特别是在餐饮行业&#xff0c;无论是大型连锁企业还是小型独立店铺&#xff0c;都在积极布局小程序开发&#xff0c;这一现象引发了我们的思考&#xff1a;为何开发小程序会成为餐饮行业的新趋势呢&#xff1f; 首…

d3dcompiler_47.dll缺失怎么修复,三种修复方法分享

打开游戏的时候&#xff0c;电脑报错“找不到d3dcompiler_47.dll无法继续执行此代码”&#xff0c;不知道怎么处理&#xff1f;下面小编就详细分享关于d3dcompiler_47.dll的三种修复方法以及作用。d3dcompiler_47.dll是Microsoft公司开发的动态链接库文件&#xff0c;属于Micro…

html实现好看的多种风格导航菜单(附源码)

文章目录 1.设计来源1.1 顶部导航菜单1.1.1 界面风格1-一二级连体导航菜单1.1.2 界面风格2-二级导航下拉框1.1.3 界面风格3-系统开始风格1.1.4 界面风格4-购物类导航菜单1.1.5 界面风格5 - 带搜索扩展的导航条1.1.6 界面风格6-火热效果多级导航条 1.2 悬浮按钮菜单1.2.1 界面风…

Retrofit学习基础

1. 基本使用 Retrofit 网络请求的工作本质上是OkHttp完成&#xff0c;而 Retrofit 仅负责 网络请求接口的封装。App应用程序通过Retrofit请求网络&#xff0c;实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息&#xff0c;之后由 OkHttp 完成后续的请求操作在服…

如何扫码看文件?多个文件如何独立建码?

现在用二维码来承载文件是很常见的一种方式&#xff0c;可以将多个不同文件做成一个二维码或者多个二维码&#xff0c;来让其他人扫码查看&#xff0c;那么文件转二维码的方法是如何来操作的呢&#xff1f;下面教大家使用二维码生成器&#xff08;免费在线二维码生成器-二维码在…

5.7.3 UDP协议格式(二)使用Wireshark分析UDP用户数据报

5.7.3 UDP协议格式&#xff08;二&#xff09;使用Wireshark分析UDP用户数据报 我们通过对Wireshark采集的UDP用户数据报进行分析&#xff0c;判定一下UDP用户数据报报文接收的是否正确&#xff0c;这里我们首先要对Wireshark采集到的UDP数据的含义。 如图 其中分组详情面板中…

编译时间和运行态时间交换的优缺点

前言 &#xff08;1&#xff09;前几天&#xff0c;我刷视频无意之间看到一个视频说&#xff0c;sizeof(a)&#xff0c;这个a是会自增吗&#xff1f; &#xff08;2&#xff09;如果有经验的人肯定会说&#xff0c;不会自增&#xff0c;这是常识。那么将这句话转化为汇编之后会…

GLP-1爆火2023:神药显雏形,争夺引内卷

2023年过半&#xff0c;如果要从创新药角度做一份总结&#xff0c;什么赛道、哪类药物会是“当红炸子鸡”&#xff1f;答案一定是GLP-1类药物。 原本用于治疗二型糖尿病的药物&#xff0c;在国内社交媒体上&#xff0c;关于司美格鲁肽的减肥奇效&#xff0c;甚至引发了一股抢药…

GBDT算法原理以及实例理解(含Python代码简单实现版)

一、算法简介&#xff1a; GBDT 的全称是 Gradient Boosting Decision Tree&#xff0c;梯度提升树&#xff0c;在传统机器学习算法中&#xff0c;GBDT算的上是TOP前三的算法。 想要理解GBDT的真正意义&#xff0c;那就必须理解GBDT中的Gradient Boosting和Decision Tree分别…