假设我们有一个数字列表,称为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