Leetcode最佳买卖交易时间的股票,如何思考

时间:2019-06-01 08:41:46

标签: algorithm dynamic-programming

我了解“有交易费的最佳买卖股票时间”的解决方案,以及与股票出售有关的其他5个问题。我只想深入了解如何在类似问题中建立这种递归关系。

我已经读过https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/discuss/108870/most-consistent-ways-of-dealing-with-the-series-of-stock-problems,并且我完全理解。

但是,我无法通过较小的更改来解决一些类似的问题,例如,是否可以在不出售之前先购买的股票的情况下购买股票。

那么,提出正确的递归关系的一般方法是什么?

我真的很困惑。非常感谢

3 个答案:

答案 0 :(得分:2)

问题有两种情况

案例 1:当我在第 i 天有一只股票时,表示为 dp[i][1],选择最大低于 2 个点

 case 1a : I bought it today.
dp[i][1] = dp[i-1][0]-prices[i]-fee

 case 1b : I am carrying a pre-bought stock
dp[i][1] = dp[i-1][1]

案例 2:当我在第 i 天没有股票时,表示为 dp[i][0]

case 2a : I sold it today
dp[i][0] = dp[i-1][1]+prices[i]

 case 2b : I sold the stock at some other previous day, doing nothing
dp[i][0] = dp[i-1][0]

以下是c#中的代码

public int MaxProfit(int[] prices, int fee) {
        int n = prices.Length;
        if(n<=1)
            return 0;
        int[,] dp=new int[n,2];
        dp[0,0] = 0;
        dp[0,1] = -prices[0]-fee;
        for(int i=1;i<n;i++)
        {
            dp[i,0] = Math.Max(dp[i-1,0],dp[i-1,1] + prices[i]);
             dp[i,1] = Math.Max(dp[i-1,1],dp[i-1,0]-prices[i]-fee);
        }
        return dp[n-1,0];
    }

答案 1 :(得分:0)

说给定的数组是:

[7、1、5、3、6、4]

如果在图表上绘制给定数组的数字,则会得到:

利润图

兴趣点是给定图中的峰和谷。我们需要在最小的山谷之后找到最大的山峰。我们可以维持两个变量-minprice和maxprofit,分别对应于到目前为止获得的最小谷值和最大利润(售价与minprice的最大差)。

class Solution {
  public int maxProfit(int[] prices) {
     int max = 0;
     int min = Integer.MAX_VALUE;

     for(int i = 0 ; i < prices.length ; i++) {
        if(prices[i] < min) {
            min = prices[i];
        }else {
            max = Math.max(max, prices[i] - min);
        }
     }

     return max; 
  }
}

答案 2 :(得分:0)

 class Solution {
   public int maxProfit(int[] prices, int fee) {
    if (prices == null || prices.length <= 1) {
        return 0;
    } 
    long profit = 0, minPrice = Integer.MIN_VALUE;
    //Integer.MIN_VALUE = - 2147483648

  for (int price : prices) {
    long profit_old = profit;
    profit = Math.max(profit, minPrice + price - fee);
    minPrice = Math.max(minPrice, profit_old - price);  
   }  

  return (int)profit;

  }
}

您的输入[1,3,2,8,4,9] 2

查看如何通过代码更新Profit&minPrice值

利润0。 minPrice -1

利润0 minPrice -1

利润0 minPrice -1

利润5 minPrice -1

利润5 minPrice 1

利润8 minPrice 1

所以最终的MaxProfit是8。