买股票的最佳时机 - 2

买卖股票的最佳时机 III

题目描述:

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 105
分析过程:

写动态规划,我们需要考虑一下问题:

  1. 定义状态
  2. 状态转移方程
  3. 初始条件
  4.  遍历顺序

4种状态:

实现先思考一共有几种状态,题目当中说我们一共最多可以买卖两次股票,所以买卖股票一共有四种情况,加上不持有股票,就是以下4种状态:

  1. 第一个持有股票
  2. 第一次卖出股票
  3. 第二次持有股票
  4. 第二次卖出股票

 转移方程:

第一次买入:
        在第 i 天,可以选择在第 i 天买入,或者保持之前的买入状态。
buy1[i] = max(buy1[i-1], -prices[i])
(初始资金为 0,第一次买入后的余额是 -prices[i])
第一次卖出:
        在第 i 天,可以选择在第 i 天卖出,或者保持之前的卖出状态。
sell1[i] = max(sell1[i-1], buy1[i-1] + prices[i])
第二次买入:
        在第 i 天,可以选择在第 i 天买入(用第一次卖出的利润),或者保持之前的买入状态。
buy2[i] = max(buy2[i-1], sell1[i-1] - prices[i])
第二次卖出:
        在第 i 天,可以选择在第 i 天卖出,或者保持之前的卖出状态。
sell2[i] = max(sell2[i-1], buy2[i-1] + prices[i])

 遍历顺序:

通过上面的转移方程,我们可以看出,我们只需要一次遍历,就可以得出我们的dp 

初始化: 

buy1[0] = -prices[0](第一天买入)
sell1[0] = 0(第一天无法卖出)
buy2[0] = -prices[0](允许同一天买入两次?其实此时第一次卖出利润为 0,所以 buy2[0] = 0 - prices[0])
sell2[0] = 0(第一天无法卖出两次)  

 代码:
class Solution {
public:int maxProfit(vector<int>& prices) {int sizes = prices.size();if (!sizes)return 0;vector<vector<int>> dp(sizes, vector<int>(5, 0));dp[0][1] = -prices[0];dp[0][3] = -prices[0];for (int i = 1; i < sizes; i++) {dp[i][1] = max(dp[i - 1][1], -prices[i]);dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]);dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3]);dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4]);}return dp[sizes - 1][4];}
};

买卖股票的最佳时机 IV

题目描述:

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

从题目当中我们可以看出,这道题多了一个限制,就是我们只能最多买k张股票

分析过程:

最多买2张股票和最多买k张股票的区别是哪里呢,买两张股票是4个状态,那买k张股票不是2k个状态吗,事实上就是这样,我们只需要在里面套上一层for循环就可以了,具体实现的逻辑和上面的一样

代码:
class Solution {
public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();// 边界情况:如果没有股票或者价格为空,直接返回 0if (n == 0) return 0;// 如果k大于等于n/2,意味着可以进行无限次交易,用贪心算法来处理if (k >= n / 2) {int profit = 0;for (int i = 1; i < n; ++i) {if (prices[i] > prices[i - 1]) {profit += prices[i] - prices[i - 1];}}return profit;}// dp[i][j] 表示在第i天进行至多j次交易的最大利润vector<vector<int>> dp(n, vector<int>(k + 1, 0));// 进行每次交易for (int j = 1; j <= k; ++j) {int maxDiff = -prices[0];  // maxDiff 表示买入股票后的最大利润for (int i = 1; i < n; ++i) {dp[i][j] = max(dp[i - 1][j], prices[i] + maxDiff);  // 不交易或者卖出股票maxDiff = max(maxDiff, dp[i][j - 1] - prices[i]);  // 更新最大买入利润}}return dp[n - 1][k];  // 返回最终最大利润}
};

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

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

相关文章

【HarmonyOS Next】地图使用详解(一)

背景 这系列文章主要讲解鸿蒙地图的使用&#xff0c;当前可以免费使用&#xff0c;并提供了丰富的SDK给开发者去自定义控件开发。目前可以实现个性化显示地图、位置搜索和路径规划等功能&#xff0c;轻松完成地图构建工作。需要注意的是&#xff0c;现在测试只能使用实体手机去…

【C++】 时间库chrono计算程序运行时间

C 时间库chrono计算程序运行时间 本文总结了chrono库的引入方法以及计算程序片段运行时间的方法 一、chrono库的引入方法&#xff08;注意事项&#xff09; 首先chrono是属于std命名空间的。 所以在程序中应该这样包含头文件&#xff1a; #include <chrono> using n…

计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

EVM系区块链开发网节点搭建及测试详细文档

文章目录 一. 编写说明1.1 文档说明1.2 配置信息二. docker 方式部署区块链开发网2.1 centos7 部署docker环境2.1.1 卸载旧版本2.1.2 使用 yum 安装2.1.3 使用官方安装脚本自动安装2.1.4 启动并加入开机启动2.2 区块链节点镜像生成2.3 区块链开发网节点容器生成2.3.1 配置文件编…

第4章 4.1 Entity Framework Core概述

4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象&#xff0c;而“关系”是关系型数据库&#xff0c;“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM &#xff0c;可以通过创建C#对象的方式把数据插入数据库而不需…

关于Yudao(芋道)和Ruoyi(若依)两个开源框架的发布时间、功能定位以及当前发展情况

根据现有信息&#xff0c;关于Yudao&#xff08;芋道&#xff09;和Ruoyi&#xff08;若依&#xff09;两个开源框架的发布时间、功能定位以及当前发展情况&#xff0c;可以综合如下分析&#xff1a; 一、发布时间与先后顺序 Ruoyi&#xff08;若依&#xff09; Ruoyi框架的公开…

JavaScript实现一个函数,找出数组中重复出现次数最多的元素。

JavaScript实现一个函数&#xff0c;找出数组中重复出现次数最多的元素。 实现思路 要找出数组里重复出现次数最多的元素&#xff0c;咱们可以这么干&#xff1a; 先弄个“小账本”&#xff08;也就是一个对象&#xff09;&#xff0c;用来记录数组里每个元素出现的次数。接…

10. 九转金丹炼矩阵 - 矩阵置零(标记优化)

哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的金丹谷,谷中有一座巨大的九转金丹炉,炉身闪烁着神秘的光芒。金丹炉的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此炉,需以九转金丹之力,炼矩阵之零,标记优化定乾坤。” 哪吒定睛一看,石碑上还有…

PostgreSQL vs MongoDB:优劣分析及适用场景

PostgreSQL vs MongoDB&#xff1a;优劣分析及适用场景 PostgreSQL 和 MongoDB 是两种非常不同的数据库系统&#xff0c;它们各自具有独特的优势和适用场景。以下是对这两种数据库的优劣分析及适用场景&#xff1a; PostgreSQL 优势&#xff1a; ACID 兼容性&#xff1a;Po…

出行项目案例

spark和kafka主要通过Scala实现&#xff0c;Hadoop和HBase主要基于java实现。 通过该项目&#xff0c;主要达到以下目的&#xff1a; &#xff08;1&#xff09;通用的数据处理流程&#xff0c;入门大数据领域 &#xff08;2&#xff09;真实体验大数据开发工程师的工作 &a…

PyEcharts 数据可视化:从入门到实战

一、PyEcharts 简介 PyEcharts 是基于百度开源可视化库 ECharts 的 Python 数据可视化工具&#xff0c;支持生成交互式的 HTML 格式图表。相较于 Matplotlib 等静态图表库&#xff0c;PyEcharts 具有以下优势&#xff1a; 丰富的图表类型&#xff08;30&#xff09;动态交互功…

五、Three.js顶点UV坐标、纹理贴图

一部分来自1. 创建纹理贴图 | Three.js中文网 &#xff0c;一部分是自己的总结。 一、创建纹理贴图 注意&#xff1a;把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意&#xff1a;将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…

使用postman测试api接口基本步骤

测试一个已写好的 API 接口需要系统性地验证其功能、性能、安全性及异常处理能力。以下是使用 Postman 进行 API 接口测试的详细步骤和注意事项&#xff1a; 1. 确认接口文档 明确输入输出&#xff1a;了解接口的请求方法&#xff08;GET/POST/PUT/DELETE&#xff09;、URL、请…

綫性與非綫性泛函分析與應用_1.例題(下)-半母本

第1章 實分析與函數論:快速回顧(下) 五、基數;有限集和無限集相關例題 例題1:集合基數的判斷 判斷集合和集合B=\{a,b,c,d,e\}的基數關係。 解析: 可以構造一個雙射,例如,,,,。 所以,兩個集合具有相同的基數。 例題2:可數集的證明 證明整數集是可數集。 解析: …

Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法

明确需要编辑器和编译器&#xff0c;并选择自己要用什么&#xff08;我选的编辑器是VSCode&#xff1a;Visual Studio Code&#xff1b;编译器是gcc&#xff09;下载VSCode并配置环境变量&#xff08;这里没啥问题&#xff09;&#xff0c;安装C/C的拓展安装Cygwin&#xff0c;…

浅拷贝和深拷贝的区别?可以举例说明

在编程中&#xff0c;浅拷贝和深拷贝是用于复制对象的两种不同方式&#xff0c;它们的主要区别在于复制对象时对对象内部成员的处理方式。今天我们对此进行讨论。 目录 1 浅拷贝 2 深拷贝 1 浅拷贝 浅拷贝创建一个新对象&#xff0c;新对象的属性值会复制原始对象的属性值…

微信小程序实现拉卡拉支付

功能需求&#xff1a;拉卡拉支付&#xff08;通过跳转拉卡拉平台进行支付&#xff09;&#xff0c;他人支付&#xff08;通过链接进行平台跳转支付&#xff09; 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…

使用ESP-IDF来驱动INMP441全向麦克风

之前的文章我们讲过了I2S。 I2S是什么通信协议&#xff1f;它如何传输音频数据&#xff1f;它和I2C是什么关系&#xff1f;_i2c接口和i2s-CSDN博客文章浏览阅读836次&#xff0c;点赞12次&#xff0c;收藏14次。这个可以参考ADC来理解&#xff0c;我们的ADC也是有左对齐和右对…

MobaXterm_Portable_v23.2 免费下载与使用教程(附安卓替代方案)

一、MobaXterm_Portable 简介 MobaXterm 是一款功能强大的全能终端工具&#xff0c;支持 SSH、SFTP、RDP、VNC、X11 转发 等多种协议&#xff0c;集成了终端、文件传输、远程桌面等功能。其便携版&#xff08;Portable Edition&#xff09;无需安装&#xff0c;解压即可使用&a…

【带你 langchain 双排系列教程】6.LangChain多模态输入与自定义输出实战指南

一、为什么需要多模态交互&#xff1f; 在真实业务场景中&#xff0c;数据从来都不是单一形式的。想象一个智能客服系统需要同时分析用户的文字描述、上传的产品图片和语音留言&#xff0c;或者一个内容审核系统需要检查文本、图像和视频的组合内容。传统单一模态的处理方式已…