题目
我的方法
思路
作为算法小白,官方里的题解什么动态规划,贪心算法,我还真说不上来,只能硬想......
把开始设为买入点,然后向后找第一个潜在的卖出点(只要收入超过了手续费就是潜在的卖出点),在这个过程中,如果有更低的价格,则这个价格就更新为此次交易的买入点,如果最终找不到卖出点,则不交易,找到了,则可以进行交易,但不一定从这个点卖出,需要则从这个点开始,找下一个买入点(价格下跌超过手续费,就成为买入点),在这个过程中,如果发现更高价格,则把更高价格更新为卖出点,直到找到下一个买入点,或者到达最后。
以上一步最终确定的买入点和卖出点进行交易。
如果这时有下一个买入点,则重新开始上面的步骤,直到到达数组末尾。
最终的收入就是上面每次交易之和。
执行结果
代码
class Solution
{
public:
Solution(): max_(0) {}
int nextBuyPos(std::size_t &salepos, vector<int> &prices, int fee)
{
for(auto i = salepos + 1; i < prices.size(); ++i)
{
if (prices[i] > prices[salepos])
salepos = i;
else if (prices[salepos] - fee > prices[i])
return i;
}
return -1;
}
void deal(std::size_t buypos, vector<int> &prices, int fee)
{
int nextbuypos = -1;
for(auto i = buypos + 1; i < prices.size(); ++i)
{
if (prices[i] < prices[buypos])
buypos = i;
else if(prices[i] - fee > prices[buypos])
{
auto salepos = i;
nextbuypos = nextBuyPos(salepos, prices, fee);
max_ += prices[salepos] - prices[buypos] - fee;
break;
}
}
if (nextbuypos != -1)
deal(nextbuypos, prices, fee);
}
int maxProfit(vector<int>& prices, int fee)
{
deal(0, prices, fee);
return max_;
}
private:
int max_;
};