用 Python 编写程序,查找两个不重叠子列表的最大和

pythonserver side programmingprogramming

假设我们有一个名为 nums 的数字列表和两个值 x 和 y,我们必须找到 nums 中长度分别为 x 和 y 的两个不重叠子列表的最大和。

因此,如果输入为 nums = [3, 2, 10, -2, 7, 6] x = 3 y = 1,则输出将为 22,因为长度为 3 的子列表我们选择 [3, 2, 10],而对于另一个子列表我们选择 [7]。

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

  • P := 具有单个元素 0 的列表
  • 对于 A 中的每个 x,执行
    • 在 处插入(P 的最后一个元素 + x) P 的结尾
  • 定义一个函数solve()。这将需要 len1、len2
  • Q := 一个列表,其中元素 (P[i + len1] - P[i]) 对于每个 i,范围从 0 到 P - len1 的大小
  • prefix := Q 的副本
  • 对于 i,范围从 0 到 prefix - 1 的大小,执行
    • prefix[i + 1] := prefix[i + 1] 和 prefix[i] 的最大值
  • ans := -infinity
  • 对于 i,范围从 len1 到 P - len2 的大小,执行
    • left := prefix[i - len1]
    • right := P[i + len2] - P[i]
    • ans := ans 的最大值和 (left +右)
  • 返回 ans
  • 从主方法执行以下操作 −
  • 返回solve(len1, len2)、solve(len2, len1)的最大值

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

示例

class Solution:
   def solve(self, A, len1, len2):
      P = [0]
      for x in A:
         P.append(P[-1] + x)
      def solve(len1, len2):
         Q = [P[i + len1] - P[i] for i in range(len(P) - len1)]
         prefix = Q[:]
         for i in range(len(prefix) - 1):
            prefix[i + 1] = max(prefix[i + 1], prefix[i])
            ans = float("-inf")
            for i in range(len1, len(P) - len2):
               left = prefix[i - len1]
               right = P[i + len2] - P[i]
            ans = max(ans, left + right)
            return ans
         return max(solve(len1, len2), solve(len2, len1))
ob = Solution()
nums = [3, 2, 10, -2, 7, 6]
x = 3
y = 1
print(ob.solve(nums, x, y))

输入

[3, 2, 10, -2, 7, 6], 3, 1

输出

22

相关文章


有用资源