该网站上提出的问题: 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。预先感谢!
答案 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;
}