LintCode 买卖股票的最佳时机 III

假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。

注意事项

你不可以同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

样例
给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6

利用两个数组left 和right,left[i]存第i天及之前的某一天卖掉股票能赚到的最大利润,right[i]存第i天及第i天之后的某一天买进股票最终能获得的最大利润。最后对两个数组遍历,求得最大的利润。
代码如下:

public class Solution {
    /*
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    public int maxProfit(int[] prices) {
        // write your code here
        if(prices.length==0){
            return 0;
        }
        int[] left=new int[prices.length];
        int[] right=new int[prices.length];
        int buy,sold,profit=0;
        buy=prices[0];
        for(int i=1;i<prices.length;i++){//第i天及之前某一天卖掉股票
            sold=prices[i];
            if(sold<buy){//如果卖价低于买价,更新买价,这一天卖掉股票的利润更新为 之前最大的利润。
                buy=sold;
                left[i]=profit;
            }
            else if(sold-buy<profit){//如果卖价高于买价,比较当前利润和之前最大利润,相应更新。
                left[i]=profit;
            }
            else{ 
                profit=sold-buy;
                left[i]=profit;
            }
        }
        sold=prices[prices.length-1];
        profit=0;
        for(int i=prices.length-2;i>=0;i--){//第i天及之后某一天买进股票,从后向前更新
            buy=prices[i];
            if(sold<buy){
                sold=buy;
                right[i]=profit;
            }
            else if(sold-buy<profit){
                right[i]=profit;
            }
            else {
                profit=sold-buy;
                right[i]=profit;
            }
        }
        int max=0;
        for(int i=0;i<left.length-1;i++){//遍历两个数组,比较最大的利润和。第i天及之前某一天卖掉股份的最大利润加上第i+1天及之后某一天买进股份的最大利润
            if(left[i]+right[i+1]>max){
                max=left[i]+right[i+1];
            }
        }
        if(left[left.length-1]>max){//只卖一次。
            max=left[left.length-1];
        }
        if(right[0]>max){//只买一次
            max=right[0];
        }
        return max;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值