在 Python 中增加 K 个子列表后最大化最小值的程序

pythonserver side programmingprogramming更新于 2026/2/1 16:12:17

假设我们有一个名为 nums 的数字列表和两个值,size 和 k。现在假设有一个操作,我们取一个长度为 size 的连续子列表并将每个元素加一。我们可以执行此操作 k 次,我们必须找到 nums 中可能的最大最小值。

因此,如果输入为 nums = [2, 5, 2, 2, 7],size = 3,k = 2,则输出将为 3,因为我们可以增加 [2, 5, 2] 以获得 [3, 6, 3, 2, 7],然后增加 [6, 3, 2] 以获得 [3, 7, 4, 3, 7],最小值为 3

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

  • 定义一个函数 possible() 。这将获取目标
  • events := 大小为 N 的列表,并用 0 填充
  • moves := 0, s := 0
  • 对于范围为 0 到 N 的 i,执行
    • s := s + events[i]
    • delta := target -(A[i] + s)
    • 如果 delta > 0,则
      • moves := moves + delta
      • s := s + delta
      • 如果 i + size < N,则
        • events[i + size] := events[i + size] - delta
  • 当 moves <= K 时返回 true
  • 从主方法中,执行以下操作
  • N := A 的大小
  • 左 := 0,右 := 10^10
  • 当 left < right 时,执行
    • mid :=(left + right + 1) / 2
    • 如果 possible(mid),则
      • left := mid
    • 否则,
      • right := mid - 1
  • return left

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

示例

class Solution:
   def solve(self, A, size, K):
      N = len(A)
   def possible(target):
      events = [0] * N
      moves = s = 0
      for i in range(N):
         s += events[i]
         delta = target - (A[i] + s)
         if delta > 0:
            moves += delta
            s += delta
            if i + size < N:
               events[i + size] -= delta
               return moves <= K
               left, right = 0, 10 ** 10
               while left < right:
                  mid = (left + right + 1)//2
               if possible(mid):
                  left = mid
               else:
                  right = mid - 1
      return left
ob = Solution()
nums = [2, 5, 2, 2, 7]
size = 3
k = 2
print(ob.solve(nums, size, k))

输入

[2, 5, 2, 2, 7], 3, 2

输出

3

相关文章


有用资源