版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
flag
软件学院大三党,每天一道算法题,第七天
题目介绍
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
思路
此题展现出来的维度有三个。
思路是先降维,将买、卖、冷冻,三个维度降维成两个维度:持有股票和未持有股票。
持有股票:今天买入和之前买入但未卖出
未持有:今天卖出和冷冻期
所以传递式为:
hold[i]=max(hold[i-1],notHold[i-2]-prices[i]); 意思是
①当前持有的股票的最大收益是昨天持有的股票(今天并未有任何操作)
②之前卖出的最大收益-今天买入的(i-2的意思是今天买入的话,昨天就应该是冷冻期)。
notHold[i]=max(notHold[i-1],hold[i-1]+prices[i]);
①当前未持有股票最大收益是昨天未持有的最大收益(今天无操作)
②昨天持有股票,今天卖了。
关键代码
public static int maxProfit(int []prices){
int n=prices.length;//炒股总天数
if(n==0)
return 0;
int []hold=new int[n];//保存持有股票当天的最大收益
hold[0]=-prices[0];//第一天持有股票即买了第一天的股票
int [] notHold=new int[n];//保存未持有股票当天的最大收益
for(int i=1;i<n;i++){
if(i>=2)
hold[i]=Math.max(hold[i-1],notHold[i-2]-prices[i]);
else
hold[i]=Math.max(hold[i-1],-prices[i]);
notHold[i]=Math.max(notHold[i-1],hold[i-1]+prices[i]);
}
return notHold[n-1];
}
总结
降维的思路非常好,简化了好多不必要的步骤