leetcode122~Best Time to Buy and Sell Stock II

Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

比较简单的做法是第一种,只要第二天比第一天的利润大,就可以收益差价,但是这种做法违反了同一天买卖的规则,不过确实可以获得最大收益。

public int maxProfit2(int[] prices) {
       int total = 0;
       for(int i=0;i<prices.length-1;i++) {
           if(prices[i+1]>prices[i]) {
               int profits = prices[i+1]-prices[i];
               total = total + profits;
           }
       }
       return total;
    }   

但是这个会违反“不能同一天买卖的规则”,例如3天的价格分别为1,2,3,那么按上述算法就会在2那天同一天买卖了。。。

正确的做法是: 第1天买第3天卖。

虽然两种方法数字结果是对的,但是逻辑不一样。。

不过虽然这么说,这道题的本事仍然是让你找最大利润,并没有让你明确哪天买哪天卖。

所以对面试官你仍然可以说,这种方法只是帮助我找到最大利润,我并没有说是要在同一天买卖,只是计算:所有第二天比前一天大的差值的合,我是为了找最大利润而已(画个趋势图讲解一下就行了。。)。
不过如果不是那样略有点投机取巧的话,干嘛非要每一次有一点点增长就加总和,带来不必要的解释麻烦?
何不先找到递减的局部最低点,再找到递增的局部最高点,算一次加和,然后再这么找? 这样就能保证买卖不会在同一天了。。

//局部最低点买进和局部 最高点卖出
    public int maxProfit(int[] prices) {

        int total = 0;
        int i = 0;
        while(i<prices.length-1) {
            int buy,sell;
            //找局部最低点
            while(i+1<prices.length && prices[i]>prices[i+1]) {
                i++;
            }
            buy = i;
            //找卖出点,至少是在下一个点
            i++;
            while(i<prices.length && prices[i]>=prices[i-1]) {
                i++;
            }
            sell = i-1;
            total += prices[sell]-prices[buy];
        }
        return total;
    }

感JustdoIT(http://www.cnblogs.com/TenosDoIt/p/3436457.html)的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值