Python程式:最大化提升K個子列表後的最小值
假設我們有一個名為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()。這將接收目標值target。
- 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的大小
- left := 0, right := 10^10
- 當left < right時,執行:
- mid :=(left + right + 1) / 2
- 如果possible(mid)為真,則
- left := mid
- 否則,
- right := mid - 1
- 返回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
廣告