My Eighty-seventh Page - 买卖股票的最佳时机 - By Nicolas
admin
2024-03-04 15:47:37
0

这篇page是针对leetcode上的188.买卖股票的最佳时机Ⅳ所写的。小尼先简单的说明一下这道题的意思,就是我们给定一个整数数组prices,它的第i个元素prices[i]是一支给的股票在第i天的价格。我们需要设计一个算法在我们完成k次交易的情况下我们可以赚到最大的利润。

其实这道题跟小尼上面的所写的只交易两次的题目非常的类似,只是说我们增加了交易的次数,意味着我们进行的操作没多一次交易我们将会进行的步骤就回增加两次,我们还是利用动态规划五部曲:

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

在动态规划:123.买卖股票的最佳时机III (opens new window)中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。

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

j的状态表示为:

  • 0 表示不操作
  • 1 第一次买入
  • 2 第一次卖出
  • 3 第二次买入
  • 4 第二次卖出
  • .....

大家应该发现规律了吧 ,除了0以外,偶数就是卖出,奇数就是买入

题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。

2.确定递推公式

还要强调一下:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区

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

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);

同理dp[i][2]也有两个操作:

  • 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
  • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

3.dp数组如何初始化

第0天没有操作,这个最容易想到,就是0,即:dp[0][0] = 0;

第0天做第一次买入的操作,dp[0][1] = -prices[0];

第0天做第一次卖出的操作,这个初始值应该是多少呢?

首先卖出的操作一定是收获利润,整个股票买卖最差情况也就是没有盈利即全程无操作现金为0,

从递推公式中可以看出每次是取最大值,那么既然是收获利润如果比0还小了就没有必要收获这个利润了。

所以dp[0][2] = 0;

第0天第二次买入操作,初始值应该是多少呢?

不用管第几次,现在手头上没有现金,只要买入,现金就做相应的减少。

第二次买入操作,初始化为:dp[0][3] = -prices[0];

所以同理可以推出dp[0][j]当j为奇数的时候都初始化为 -prices[0],在初始化的地方同样要类比j为偶数是卖、奇数是买的状态

4.确定遍历顺序

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

5.导出递推公式

小尼接下来拉一下这道题的解题代码:

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

小尼简单的说明一下这道题的解题的思路,其实还是比较简单的,其实就是我们在两层递归中我们一共是进行两部操作,我们只是再将步数进行不断的重复,我们进行的第一步就是买入,这里就是对应我们的j+1的操作,我们第二步就是做卖出的操作,这里对应的步骤就是j+2的操作。我们第一层递归的是我们的物品数,我们的第二层递归的是我们的k的层数,因为每当我们增加一次交易的机会,我们的步骤就会增加两个,所以我们再循环中所设的限制就是j < k*2 - 1.

希望上面的代码可以帮助到小伙伴们~~~

相关内容

热门资讯

华夏幸福继续减持 厦门国际银行... 5月18日,河北金融监管局发布批复显示,同意厦门国际银行股份有限公司受让华夏幸福基业控股股份公司持有...
离境退税2.0版政策上线 境外... 本文转自【央视新闻客户端】; 今天(18日),我国离境退税2.0版政策正式上线,以后境外旅客来华购物...
原创 在... 老周坐在东京中野区那间不大的公寓里,又把账本翻了一遍。手边是厚厚的日元工资条,电脑屏幕上开着国内某二...
探索“筷子夹火箭”的商业航天公... 上证报中国证券网讯 国内唯一“不锈钢箭体+液氧甲烷动力+筷子捕获臂回收”技术路线的商业火箭公司再度融...
5月30日晚8点开启!首次全场... 潮新闻客户端 记者 周夏林 又好又便宜的京东618,今年来得有点“聪明”。 5月18日,京东宣布,2...
2026年太和县黄金回收权威机... “家里压箱底的金项链断了,金戒指戴旧了,想去回收却又担心被压价、被掉包。”这是我在太和县做珠宝行业多...
A股“下半场”怎么走?券商最新... 【导读】券商密集召开中期策略会 中国基金报记者 孙越 临近年中,2026年券商中期策略会正迎来密集召...
爱德泰由董事长白长安夫妇控股9... 瑞财经 吴文婷近日,深圳市爱德泰科技股份有限公司(以下简称“爱德泰”)在港交所递交招股书,中信证券、...
前CIA资助研究员:美寻获4种... 近日,一名曾接受美国中央情报局(CIA)资助的前政府研究员曝出惊人消息,声称美国已从坠毁的不明飞行物...
原创 欧... 2026年5月,全球巧克力设备圈炸开了一口大锅。 一百多年来,生产线上那几根核心精磨辊筒,一直被瑞士...
商务部等六部门:加力扩大入境消... 商务部、财政部、国家税务总局等6部门日前发布《关于加力优化离境退税措施扩大入境消费的通知》,此次政策...
飞天没涨价,但茅台真正的变革,... 2026年5月16日零时整,i茅台App推送了一条公告。 不是限量发售,不是新品上架,是涨价。 四款...
“不含白酒”!消费主题ETF营... 【导读】“不含白酒”成了消费主题ETF的营销新卖点? 见习记者 闫军 近期,有基金公司宣传食品饮料E...
金价又崩了!5月这波下跌,藏着... 昨天看行情的时候,我一度以为自己眼花了。 5月18日亚市早盘,现货黄金伦敦金直接失守4500美元/盎...
拿下百年药企、进军医院市场,广... (本文作者为 牛刀财经NiuDaoCJ,钛媒体经授权发布) 文 | 牛刀财经NiuDaoCJ ...
一心卖车的蔚来,终于被看懂了 作者 | 定焦One 陈颐 中国资本市场对新能源汽车的态度,最近一年发生了转变。 具身智能、飞行汽...
原创 杨... 赚的不多,拿的不少。 作者 | 于婞 编辑丨高岩 来源 | 野马财经 与明星爱人黄圣依再见1年后,“...
历史首次!东莞A股上市公司,市... 据东莞市上市公司协会消息,截至2026年5月15日收盘,东莞64家A股上市公司总市值首次突破万亿元,...
对标行业龙头先导智能,格林晟港... 在锂电制造的中段——从极片到电芯成型的核心环节,有一项设备至关重要:叠片机,它直接决定了电池的能量密...
银行存款大局已定?明后年,存款... 银行存款的大局,已经从“怎么多赚点利息”,变成了“怎么少亏点、别踩坑”。 2025年以来,存款利率一...