美文网首页程序员坚持LeetCode
跟我坚持刷leetcode(第五天-进阶版最大股票利润)

跟我坚持刷leetcode(第五天-进阶版最大股票利润)

作者: 北极星光熊 | 来源:发表于2017-04-06 20:02 被阅读257次

对抗惰性,从今天做起。坚持每天刷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;
}

相关文章

网友评论

    本文标题:跟我坚持刷leetcode(第五天-进阶版最大股票利润)

    本文链接:https://www.haomeiwen.com/subject/rinqattx.html