当前位置: 首页 > 知识库问答 >
问题:

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

慕铭
2023-03-14

我了解用交易费购买和出售股票的最佳时间的解决方案,以及与股票出售相关的其他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个答案

慕鸿波
2023-03-14
 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

看看利润如何

利润0. minPrice-1

利润0分钟价格-1

利润0分钟价格-1

利润5分钟价格-1

利润5分钟价格1

利润8分钟价格1

所以最终最大利润是8。

浦出野
2023-03-14

假设给定的数组是:

[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; 
  }
}
经骁
2023-03-14

这个问题有两种情况

案例1:当我在第一天有一只股票,用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:当我在第一天没有股票时,表示为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];
    }
 类似资料:
  • 尝试解决这个问题:假设您有一个数组,其中第i个元素是给定股票在第i天的价格。 设计一个算法来寻找最大利润。您最多可以完成两笔交易。 解决方案:我正在做的是分而治之的方法。 dp[i][j]是ith和jth day之间的最大利润。计算如下: dp[i][j]=max(dp[i][j],max(prices[i]-prices[j],dp[k][j],dp[i][k1]),其中k小于i且大于j。 现在

  • 本文向大家介绍基于java计算买卖股票的最佳时机,包括了基于java计算买卖股票的最佳时机的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了基于java计算买卖股票的最佳时机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题: 可以将问题转化为如下图所示,即求多个累计的收入差 分析: 如果当前位置i的价格比i+1的价格高,则当前不是买

  • 本网站提出的问题:https://www.interviewbit.com/problems/best-time-to-buy-and-sell-stocks-iii/ 假设你有一个数组,其中第i个元素是给定股票在第i天的价格。 设计一个算法来寻找最大利润。您最多可以完成两笔交易。 注意:你不能同时进行多笔交易(即,你必须在再次购买之前卖出股票)。 我的解决方案: 我的想法是跟踪所有利润(我以当地

  • 给你n天的股票价格。通过股票交易获得最大利润。你每天最多只能交易一次:每天你可以选择购买一只股票,或者卖出一只股票(如果你有),或者放弃当天的交易,什么都不做。 给定,返回 解释: 你可以在第一天和第二天购买,在第三天和第四天出售。 利润:-1-2109=16 给定,返回 解释: 你可以在第二天买入,第四天卖出。 利润:-5 10=5 困难的部分是,你可以进行连续的买入和/或卖出,这意味着一旦你持

  • 有人给了我一个课本上的问题,我弄不懂。它是: 假设您有一只股票STOK,您打算将所有资金投资一个月(天),到月底您无法持有任何股票。您有钱。对于任何一天STOK的价格都是,并且在任何一天您都可以买卖股票。但是,您一天可以买卖多少股票是有限制的(买卖是一样的)。如果您愿意,您可以购买非整数单位的股票,以便于计算。鉴于这些功能,您如何安排购买计划以最大化您的利润? 天真的解决方案:每天在以下限制条件下

  • 假设你有一个数组,其第i个元素是第一天给定股票的价格。 如果您可以进行无限次的买卖(一次只能持有一只股票),但每次出售都需要支付交易费,请计算您可以获得的最大利润。 样本输入{1,3,7,5,10,3}fee=3。 如果你做了两次交易,总利润是(7-1)-3(10-5)-3=5。如果你只进行一次交易,总利润为(10-1)-3=6。 最初的版本很简单,但我不知道如何接近这个修改后的版本。有人能给我一