美文网首页程序员坚持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