对抗惰性,从今天做起。坚持每天刷leetcode并附带一个题的题目,思路,代码。感兴趣的小伙伴一起坚持来吧(c代码,不过思路都是差不多的)。
题目(难度困难):
给出一个数组,第i个元素代表第i天的股票价格。假设你最多只能买卖两次股票(买一次,卖一次。再买,再卖。不能连着买两次,再连着卖两次。当然也可以只买卖一次),请求出你最多能赚到多少钱。
Input:[1,6,4,3,10,6,7]
Output:12
思路:
接着昨天的简单版股票利润,我先想到的是怎么在原有的基础改进。如果能储存一下数据记录对于某一天来说之前能赚多少钱,那么加上上一题求出来的后面的最大值,就得到了以这一天为分割,左右两侧max的和。再比较一下这些和,求出最大值返回就行了。现在的问题就是如何求出左侧max(代码里是max1)的值,max的值有两种情况,一种是分割点价值减去左侧出现过的最小价值,另一种是直接等于上一天的max值。比较出最大值就是左侧max值
代码:
int maxProfit(int* prices, int pricesSize) {
int min = prices[0];
int i = 1;
int temp = 0;
int max = 0;
int max2 = 0; //用来储存有右面的最大值
int* max1 = malloc(sizeof(int)*pricesSize);//用来储存左面的最大值
max1[0] = 0;
//下面的while记录了以任何一天为分割点,左侧利润最大值。
while(i<pricesSize)
{
max1[i] = prices[i]-min;
if(max1[i]<max1[i-1])
max1[i] = max1[i-1];
if(prices[i]<min)
min = prices[i];
i++;
}
//下面的for按分割点循环,并跟踪右侧最大值,顺便求出总的最大值
for(i=pricesSize-2;i>=0;i--)
{
temp = prices[i+1]-prices[i]+temp;
if(temp<0)
temp = 0;
if(temp>max2)
max2 = temp;
if((max1[i]+max2)>max)
max = max1[i]+max2;
}
if(max1[pricesSize-1]>max)
return max1[pricesSize-1];
else
return max;
}