本文共 3063 字,大约阅读时间需要 10 分钟。
class Solution { public: int maxProfit(vector & prices) { int OneBuy = INT_MAX; int TwoBuy = INT_MAX; int OneBuyOneSell = 0; int TwoBuyTwoSell = 0; for (int i = 0; i < prices.size(); i++) { int temp = prices[i]; OneBuy = min(temp, OneBuy); OneBuyOneSell = max(temp - OneBuy, OneBuyOneSell); TwoBuy = min(TwoBuy, temp - OneBuyOneSell); TwoBuyTwoSell = max(TwoBuyTwoSell, temp - TwoBuy); } return TwoBuyTwoSell; }};
代码的书写其实不太利于阅读,我们可以逐行进行分析,首先我们定义了四个变量,第一次购买的价格,第一次售出后我们的盈利,第二次购买的价格(这里要注意,这里的价格不是真真的当天价格,而是需要减去第一次盈利的价格,或者说是亏损的成本),以及一个第二次的盈利。
我们来看for循环,OneBuy和OneBuyOneSell大家应该没有什么问题,主要的是TwoBuy的怎么求解,博主在这里也是想了很久,然后自己单步调试了两遍才算明白背后的直觉思想,为什么说是直觉,因为我感觉我解释不清为什么这样做是对的,但是他确实是这个道理,哈哈哈。好了,我们来具体走一遍。i 3 3 5 0 0 3 1 4int OneBuy = 3int OneBuyOneSell = 0int TwoBuy = 3int TwoBuyTwoSell = 0; i 3 3 5 0 0 3 1 4int OneBuy = 3int OneBuyOneSell = 0int TwoBuy = 3int TwoBuyTwoSell = 0; i 3 3 5 0 0 3 1 4int OneBuy = 3int OneBuyOneSell = 5 - 3int TwoBuy = 3int TwoBuyTwoSell = 5 - 3 i 3 3 5 0 0 3 1 4int OneBuy = 0int OneBuyOneSell = 2int TwoBuy = 0 - 2int TwoBuyTwoSell = 0 - (-2) i 3 3 5 0 0 3 1 4int OneBuy = 0int OneBuyOneSell = 2int TwoBuy = 0 - 2int TwoBuyTwoSell = 0 - (-2) i 3 3 5 0 0 3 1 4int OneBuy = 0int OneBuyOneSell = 3int TwoBuy = min(-2, (3 - 3) ) = -2int TwoBuyTwoSell = 3 - (-2) = 5 (这里其实已经能看出来点TwoBuy记录的是我已经盈利了2,现在股票价格是3 我依然买,但是成本我需要再次下降) i 3 3 5 0 0 3 1 4int OneBuy = 0int OneBuyOneSell = 3int TwoBuy = min(-2, (1 - 3) ) = -2int TwoBuyTwoSell = max(5, 1 - (-2) ) = 5 i 3 3 5 0 0 3 1 4int OneBuy = 0int OneBuyOneSell = 4int TwoBuy = min(-2, 0) = -2int TwoBuyTwoSell = max(5, (4 - (-2))) = 6
至此题目已经解答出,博主也是写了很多次勉强理解,我觉得还是要多思考,过段时间再来看一下,因为我觉得长时间不想一想应该忘得很快。好了不多说了。
转载地址:http://mgfnb.baihongyu.com/