leetcode123. 买卖股票的最佳时机 III(java)

news2024/11/9 6:12:27

买卖股票的最佳时机

  • leetcode123. 买卖股票的最佳时机 III
    • 题目描述
    • 动态规划
      • 代码演示
  • 动态规划专题

leetcode123. 买卖股票的最佳时机 III

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii

题目描述

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

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

示例 2:
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。

示例 4:
输入:prices = [1]
输出:0

提示:
1 <= prices.length <= 105
0 <= prices[i] <= 105

动态规划

动态规划主要是找到变化的状态,根据题目描述,我们可以看到,天数,和交易次数,都是变化的状态,还有就是持有股票的状态,持有的状态只有两个,持有和没持有,我们用0代表没持有,1代表持有。然后我们用一个三维数组来组织这个dp表。

dp[i][k][0 or 1]
0 <= i <= n - 1, 1 <= k <= K
n 为天数,大 K 为交易数的上限,0 和 1 代表是否持有股票。
此问题共 n × K × 2 种状态,全部穷举就能搞定。

持有股票的状态是相互转换的。
在这里插入图片描述
根据这个转换关系,我们可以写出下面的状态转移方程:

dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
解释:今天我没有持有股票,有两种可能,我从这两种可能中求最大利润:
1、我昨天就没有持有,且截至昨天最大交易次数限制为 k;然后我今天选择 rest,所以我今天还是没有持有,最大交易次数限制依然为 k。
2、我昨天持有股票,且截至昨天最大交易次数限制为 k;但是今天我 sell 了,所以我今天没有持有股票了,最大交易次数限制依然为 k。

2.dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
解释:今天我持有着股票,最大交易次数限制为 k,那么对于昨天来说,有两种可能,我从这两种可能中求最大利润:
1、我昨天就持有着股票,且截至昨天最大交易次数限制为 k;然后今天选择 rest,所以我今天还持有着股票,最大交易次数限制依然为 k。
2、我昨天本没有持有,且截至昨天最大交易次数限制为 k - 1;但今天我选择 buy,所以今天我就持有股票了,最大交易次数限制为 k。

根据上面总结,我们得出状态转移方程:
dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])

代码演示

class Solution {
    public int maxProfit1(int[] prices) {
        int N = prices.length;
        //交易两次
        int K = 2;
        int[][][]dp = new int[N][K + 1][2];
        for(int i = 0; i < N;i++){
            for(int j = K;j >= 1;j--){
            		//防止越界,第一天的状态单独讨论。
                if(i == 0){
                	//没持有,就是0
                    dp[i][j][0] = 0;
                    //持有的话,就是买股票消耗的资金
                    dp[i][j][1] = -prices[i];
                    continue;
                }
                //状态转移方程
                dp[i][j][0] = Math.max(dp[i - 1][j][0],dp[i- 1][j][1] +prices[i]);
                dp[i][j][1] = Math.max(dp[i - 1][j][1],dp[i - 1][j - 1][0] - prices[i]);
            }
        }
        return dp[N - 1][K][0];
    }

  
}

动态规划专题

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

leetcode312. 戳气球

leetcode63. 不同路径 II

leetcode62. 不同路径

leetcode877. 石子游戏

leetcode64. 最小路径和

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

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

相关文章

API手册使用方式说明

API手册使用方式说明 其实我们在API阶段,更多是要去学习别人已有内容,比如方法的使用 但是这么多的方法对于新手来说其实是不太友好的,刚开始根本记不住呀 所以API手册就是我们的一个好帮手,我们可以在API手册查到目标内容的介绍 类似于小学刚学字的时候,不会的字就可以去查字…

连接器信号完整性仿真教程 四

本文详细讲解了CST做连接器信号完整性仿真时,如何从材料库中载入材料,如何新增材料、如何编辑材料属性、如何将材料添加到库中,以及如何设置仿真模型材料、并以实例逐步做了详细演示。 一 从材料库中载入材料 从材料库中载入材料有两种方法。 方法一 点击菜单"Modelin…

Android 12 以上PendingIntent使用注意FLAG_IMMUTABLE

遇到如下报错&#xff1a; Fatal Exception: java.langlllegalArgumentException : Targeting S (version 31 and above) reures that one of FLAG_MMUTABLE r FLA-MUTABLE be specfed when creating a Pendinglntent. Strongly consider using FLAG_JMMUTABLE only use FLAG_M…

Redis的缓存类型分析

HashMap/ConcurrentHashMap HashMap 是一种基于哈希表的集合类&#xff0c;它提供了快速的插入、查找和删除操作。是很多程序员接触的第一种缓存 , 因为现实业务场景里&#xff0c;我们可能需要给缓存添加缓存统计、过期失效、淘汰策略等功能&#xff0c;HashMap 的功能就显得…

如何搭建产品知识库?让产品知识库管理更有序高效!

在现代企业中&#xff0c;一个完善的产品知识库对于提升团队的工作效率和产品质量至关重要。本文将介绍如何搭建一个高效的产品知识库&#xff0c;并提供一些管理方法&#xff0c;以使知识库的管理更有序、高效。 随着科技的不断进步和市场竞争的加剧&#xff0c;企业对于高效…

python基础学习--01

1.python环境的安装&#xff1a; 1.安装 Python 解释器&#xff1a;https://www.python.org/ 1.选择下载&#xff1a; 2.选择windows x86 -64 可执行的安装文件 (根据自己电脑的操作系统选择&#xff09; 3.安装完成后 左下角点击开始地方能看到这些说明安装好了。 4.安装…

SpringBoot原理(1)--@SpringBootApplication注解使用和原理

文章目录 前言主启动类的配置SpringBootConfiguration注解验证启动类是否被注入到spring容器中 ComponentScan 注解ComponentScan 注解解析与路径扫描 EnableAutoConfiguration注解 问题解答1.AutoConfigurationPackage和ComponentScan的作用是否冲突起因回答 2.为什么能实现自…

双路高速 AD 实验

目录 双路高速 AD 实验 1、简介 3PA1030 芯片 2、实验任务 3、程序设计 3.1、hs_dual_ad 模块代码 clk_wiz IP 核 的添加方法 ILA IP 核&#xff08;集成逻辑分析器&#xff1a;Integrated Logic Analyzer&#xff0c;ILA&#xff09; 4、硬件设计 4.1、添加.xdc约束…

23年软考网络工程师是什么?主要是考什么,有什么用?

网络工程师每年考两次&#xff0c;相比其他的软考考试一年中考的机会又多了一次 网络工程师证书考到后&#xff0c;通过本级考试的合格人员能根据应用部门的要求进行网络系统的规划、设计和网络设备的软硬件安装调试工作&#xff0c;能进行网络系统的运行、维护和管理&#xf…

汽车行业项目管理面临的5个挑战及解决方案

汽车行业正跨越式地迈向新的未来。其目前的发展主要由四大趋势驱动&#xff1a;连接性、自动驾驶汽车、共享出行和电气化。这给汽车企业带来了诸多挑战&#xff1a;竞争加剧&#xff0c;快速发展带来的频繁变化&#xff0c;与软件公司建立伙伴关系&#xff0c;以及其他相关问题…

GIS 功能模块实现

文章目录 1. GIS 模块流程图2. 网页端地图缓存的实现3. GIS 图形操作功能实现1 &#xff09;地图漫游2 &#xff09;对象删除3 &#xff09;选择复制属性查看 GIS 基本功能模块主要是在表现层开发的&#xff0c;是在OpenLayers 开发框架提供的接口上&#xff0c;通过Geo Server…

【计算机网络复习之路】应用层(谢希仁第八版)

专栏&#xff1a;计算机网络复习之路 目录 一、域名系统DNS 1.1 本地域名服务器采用迭代查询 1.2 本地域名服务器采用递归查询 二、文件传送协议FTP 三、远程终端协议TELNET 四、万维网WWW (World Wide Web) 4.1 万维网需要解决的问题 【1】怎样标志分布在整个互联网…

在 Swift 中使用 async let 并发运行后台任务

文章目录 前言长期运行的任务阻塞了UI使用 async/await 在后台执行任务在后台执行多个任务使用 "async let " 下载多个文件结论 前言 Async/await 语法是在 Swift 5.5 引入的&#xff0c;在 WWDC 2021中的 Meet async/await in Swift 对齐进行了介绍。它是编写异步代…

实时日志管理分析解决方案

什么是日志管理 组织网络可能很复杂&#xff0c;由大量互连的系统、应用程序和设备组成。这些组件中的每一个都会生成大量日志数据&#xff0c;捕获有关系统事件、用户活动和网络流量的详细信息。生成的日志数据量庞大&#xff0c;因此难以有效管理和分析。 日志管理是收集、…

使用 DFS 解决排列数字问题并使用 pythontutor 可视化

使用 DFS 解决排列数字问题并使用 pythontutor 可视化 问题描述 给定一个整数 n n n&#xff0c;将数字 1 ∼ n 1∼n 1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数…

盘点内核中常见的CPU性能卡点

我们的应用程序都是运行在各种语言的运行时、操作系统内核、以及 CPU 等硬件之上的。大家平时一般都是使用Go、Java等语言进行开发。但这些语言的下面是由运行时、内核、硬件等多层支撑起来的。 我们的程序在运行的时候&#xff0c;很多时候性能卡点可能并不一定是自己的应用代…

Win系统下同时访问公司内网及公网设置

一、修改系统配置 修改系统配置&#xff0c;使公网默认不走VPN路由&#xff1b; 连接VPN&#xff0c;并查看路由表&#xff1b; route print可以看到&#xff0c;多了些路由信息&#xff0c;此时测试公网能否正常访问&#xff0c;如能正常访问&#xff0c;则继续往下。 二、…

入职字节两个月,实在卷不动,还是离职了

对自己收入不满意&#xff0c;就看下自己每天做了什么&#xff0c;把每天记录下来&#xff0c;看下自己的时间都用在哪里了。 对自己的时间分配搞清楚了&#xff0c;就可以着手去改进&#xff0c;如果一直糊涂的过&#xff0c;时间到了报复就来了。 时间管理很简单&#xff0c…

零代码、一键生成、低成本,深兰科技硅基大脑SaaS平台国内首发

在6月20日举行的2023中国(苏州)独角兽企业大会上&#xff0c;深兰科技创始人、董事长陈海波在主旨演讲中宣布&#xff0c;深兰科技推出“深兰科技硅基大脑SaaS平台”&#xff0c;旨在为个人和企业提供更便捷、更全面的大语言模型智能化应用。 AI大模型驱动“智慧涌现”&#xf…

Redis实战篇(一)

Redis实战篇基于哔哩哔哩中黑马程序员的黑马点评项目 一.缓存 1.1 缓存概述 1.什么是缓存 缓存&#xff0c;就是数据交换的缓冲区&#xff0c;俗称的缓存就是缓冲区内的数据&#xff0c;一般从数据库中获取&#xff0c;存储于本地代码 2.为什么要使用缓存 缓存数据存储于…