nums라고 하는 숫자 목록과 size와 k라는 두 개의 값이 있다고 가정합니다. 이제 길이 크기의 연속적인 하위 목록을 가져와 모든 요소를 하나씩 증가시키는 작업이 있다고 가정합니다. 이 작업을 k번 수행할 수 있으며 가능한 가장 큰 최소값을 숫자로 찾아야 합니다.
따라서 입력이 nums =[2, 5, 2, 2, 7], size =3, k =2와 같으면 출력은 [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 + 이벤트[i]
- 델타 :=대상 -(A[i] + s)
- 델타> 0이면
- 이동 :=이동 + 델타
- s :=s + 델타
- i + size
- 이벤트[i + 크기] :=이벤트[i + 크기] - 델타
- 중간 :=(왼쪽 + 오른쪽 + 1) / 2
- 가능하다면(mid),
- 왼쪽 :=중간
- 그렇지 않으면
- 오른쪽 :=중간 - 1
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
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