用 Python 买入和卖出股票 III 的最佳时机

pythonserver side programmingprogramming

假设我们有一个数组,其中第 i 个元素代表第 i 天某只股票的价格。我们必须设计一种算法来找到最大利润。我们最多可以完成两笔交易。因此,如果给定的价格为 [3,3,5,0,1,3,1,4],则结果将为 6,因为我们将在第 4 天(价格 0)买入,然后在第 6 天(价格 3)卖出,因此利润为 3 – 0 = 3。现在在第 7 天(价格 1)卖出,在第 8 天(价格 4)卖出,因此利润为 4 – 1 = 3。

为了解决这个问题,我们将遵循以下步骤 −

  • n := s 的大小,m := t 的大小。通过在 s 和 t 前面连接空格来更新它们

  • 制作一个大小为 (n + 1) x (m + 1) 的矩阵

  • 设置 dp[0, 0] := 1,然后将所有行的第 0 列设置为 1,放入 1

  • 对于 i 在 1 到 n 范围内

    • 对于 j 在 1 到 m 范围内

      • 如果 s[i] = t[j],则

        • dp[i, j] := dp[i – 1, j – 1]

      • dp[i, j] := dp[i, j] + dp[i – 1, j]

  • return dp[n, m]

示例

让我们看看下面的实现以便更好地理解 −

class Solution(object):
   def maxProfit(self, p):
      if not p:
         return 0
      n = len(p)
      dp = [0 for i in range(n)]
      ans = 0
      xmin = p[0]
      for i in range(1,n):
         xmin = min(xmin,p[i])
         dp[i] = max(dp[i],p[i]-xmin)
         ans = max(ans,dp[i])
      xmax = [0 for i in range(n)]
      xmax[-1] =p[-1]
      tempp = 0
      for i in range(n-2,-1,-1):
         xmax[i] = max(xmax[i+1],p[i])
      xmin = [p[-1],n]
      for i in range(n-2,-1,-1):
         tempp = max(tempp,xmax[i+1]-p[i+1])
         ans = max(ans,dp[i]+tempp)
      return ans
ob = Solution()
print(ob.maxProfit([3,3,5,0,1,3,1,4]))

输入

[3,3,5,0,1,3,1,4]

输出

6

相关文章