假设我们有一个数组,第i个元素是第i天给定股票的价格。我们必须设计一种算法来找到最大的利润。我们可以根据需要完成尽可能多的交易(因此,要购买一股并多次出售一股股票)。但是我们必须遵循这些规则-
我们可能不会同时进行多项交易(因此,在您再次购买之前,我们必须出售股票)。
出售股票后,第二天就不能购买股票。(所以冷静1天)
如果输入类似于[1,2,3,0,2],则输出将为3,序列类似于[买,卖,冷却,买,卖]
为了解决这个问题,我们将遵循以下步骤-
endWithSell:= 0,endWithBuy:= -ve无限,prevBuy:= 0和prevSell:= 0
对于i:= 0到给定数组的大小
prevBuy:= endWithBuy
endWithBuy:= endWithBuy和prevSell的最大值– Arr [i]
prevSell:= endWithSell
endWithSell:= endWithSell和prevBuy + Arr [i]的最大值
返回endWithSell
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxProfit(vector<int>& p) { int endWithSell = 0; int endWithBuy = INT_MIN; int prevBuy =0, prevSell = 0; for(int i =0;i<p.size();i++){ prevBuy = endWithBuy; endWithBuy = max(endWithBuy,prevSell - p[i]); prevSell = endWithSell; endWithSell = max(endWithSell, prevBuy + p[i]); } return endWithSell; } }; main(){ Solution ob; vector<int> v = {1,2,3,0,2}; cout << (ob.maxProfit(v)); }
[1,2,3,0,2]
输出结果
3