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

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

因此,如果输入类似于nums = [2,5,2,2,7],大小= 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填充

  • 移动:= 0,s:= 0

  • 对于0到N范围内的i,执行

    • 移动:=移动+增量

    • s:= s +增量

    • 如果我+大小<N,则

    • 事件[i +大小]:=事件[i +大小]-增量

    • s:= s +事件[i]

    • 增量:=目标-(A [i] + s)

    • 如果增量> 0,则

    • 当移动<= K时返回true

    • 在主要方法中,执行以下操作

    • N:= A的大小

    • 左:= 0,右:= 10 ^ 10

    • 当左<右时

      • 右:=中-1

      • 左:=中

      • 中:=(左+右+1)/ 2

      • 如果可能(中),则

      • 除此以外,

      • 返回左

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

      示例

      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
      猜你喜欢