这个题dp不假,但真正的难点是因为他要动态规划不断最优化的不只一个最后的最优解,和这最优解相关的参数也在动态规划着。
这里我定义了四个参数:first_in,first_pro,second_in,second_pro。
first_in:第一次买入的价格
first_pro:第一次卖出后赚的利益
second_in:第二次买入的价格-第一次赚的利益
second_pro:总共赚的
class Solution:
def maxProfit(self, prices: List[int]) -> int:
first_in,first_pro,second_in,second_pro=float('inf'),0,float('inf'),0
for i in prices:
first_in=min(first_in,i)
first_pro=max(first_pro,i-first_in)
second_in=min(second_in,i-first_pro)
second_pro=max(second_pro,i-second_in)
return second_pro
优化一下算法,由于一直用的max,min来进行的判断,但由于判断的是两个。我们不妨用if else来判断,由于if else速度要快于max,min。毕竟max,min针对的是很多数,而if else只针对两个的。
我又去调试了一下,在两个数判断上,确实差四五倍的效率。
优化后代码如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
first_in,first_pro,second_in,second_pro=float('inf'),0,float('inf'),0
for i in prices:
first_in=first_in if first_in<i else i
first_pro=first_pro if first_pro>i-first_in else i-first_in
second_in=second_in if second_in<i-first_pro else i-first_pro
second_pro=second_pro if second_pro>i-second_in else i-second_in
return second_pro
以下为同样思路的C++代码:
依然击败了100%
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int first_in=INT_MAX,first_pro=0,second_in=INT_MAX,second_pro=0;
int n=prices.size();
for(int i=0;i<n;i++)
{
first_in=first_in<prices[i]?first_in:prices[i];
first_pro=first_pro>prices[i]-first_in?first_pro:prices[i]-first_in;
second_in=second_in<prices[i]-first_pro?second_in:prices[i]-first_pro;
second_pro=second_pro>prices[i]-second_in?second_pro:prices[i]-second_in;
}
return second_pro;
}
};