最多买卖两笔交易的最佳买卖股票时间

时间:2019-03-12 13:59:56

标签: algorithm

该网站上提出的问题: https://www.interviewbit.com/problems/best-time-to-buy-and-sell-stocks-iii/

假设您有一个数组,第i个元素是第i天给定股票的价格。

设计算法以找到最大利润。您最多可以完成两笔交易。

注意: 您可能不能同时进行多项交易(例如,必须先出售股票才能再次购买)。

我的解决方案

int Solution::maxProfit(const vector<int> &A) {
    int i = 0, sz = A.size();
    int buy_price, sell_price;

    int profit, max_profit1 = 0, max_profit2 = 0;

    while(i<sz){
        while(i<sz-1 && A[i+1] < A[i]) ++i;
        buy_price = A[i];
        while(i<sz-1 && A[i+1] > A[i]) ++i;
        sell_price = A[i];
        profit = sell_price-buy_price;

        if(profit > max_profit2) {
            swap(max_profit1, max_profit2);
            max_profit2 = profit;
        }
        else if(profit > max_profit1) max_profit1 = profit;

        ++i;
    }

    return max_profit1 + max_profit2;
}

我的想法是跟踪所有利润(其中我以当地最低价格购买并以当地最高价格出售);并挑选前两个。我跟踪变量max_profit1和max_profit2的2个最大利润,其中max_profit1

我在各种情况下都尝试过此方法,并获得了所需的答案,但是我在OJ上面临着不正确的提交。请帮助我指出该方法的缺陷-希望在这种情况下避免DP。预先感谢!

3 个答案:

答案 0 :(得分:2)

本地最小值和最大值可能不是最佳的,因为我们有2笔交易可用。

您的代码有时会使用错误的局部最小值/最大值

例如给定输入:

  

1 1 3 1 3 2 4

您的解决方案给出:4

正确的答案是:5

答案 1 :(得分:0)

对于以下输入,这将失败: [1,2,4,2,5,7,2,4,9,0]

在这种情况下,答案应该是13。(在第1天购买,在第6天出售,在第7天购买,在第9天出售)。

但是根据代码,它返回12。

答案 2 :(得分:-1)

您可以尝试以下方法:

public int maxProfit(int[] prices) {
    int sell1 = 0, sell2 = 0;
    int buy1 = Integer.MIN_VALUE, buy2 = Integer.MIN_VALUE;

    for(int i = 0; i < prices.length; i++) {
        buy1 = Math.max(buy1, -prices[i]);
        sell1 = Math.max(sell1, buy1 + prices[i]);
        buy2 = Math.max(buy2, sell1 - prices[i]);
        sell2 = Math.max(sell2, buy2 + prices[i]);
    }
    return sell2; 
}