nums라는 숫자 목록과 또 다른 값 k가 있다고 가정하면 가장 큰 합계를 가진 k 하위 목록을 찾고 그 합계를 내림차순으로 반환해야 합니다.
따라서 입력이 nums =[2, 4, 5, -100, 12, -30, 6, -2, 6] k =3과 같으면 출력은 [10, 11, 12]가 됩니다. [6, -2, 6], [2, 4, 5], [12]의 합이 가장 큰 3개의 하위 목록이 있습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- ps :=1 + 숫자 크기의 목록과 0으로 채움
- 각 인덱스 i와 값 v num에 대해 다음을 수행합니다.
- ps[i + 1] :=v + ps[i]
- hp :=새 목록
- 0에서 ps 크기의 범위에 있는 i에 대해
- i + 1 범위에서 ps 크기의 j에 대해
- ps 힙에 -(ps[j] - ps[i]) 삽입
- i + 1 범위에서 ps 크기의 j에 대해
- res :=ps 힙의 모든 요소를 팝하고 뒤집습니다.
- 반환 결과
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
from heapq import heappop, heappush class Solution: def solve(self, nums, k): ps = [0 for _ in range(len(nums) + 1)] for i, v in enumerate(nums): ps[i + 1] = v + ps[i] hp = [] for i in range(len(ps)): for j in range(i + 1, len(ps)): heappush(hp, -(ps[j] - ps[i])) return list(reversed([-heappop(hp) for _ in range(k)])) ob = Solution() nums = [2, 4, 5, -100, 12, -30, 6, -2, 6] k = 3 print(ob.solve(nums, k))
입력
[2, 4, 5, -100, 12, -30, 6, -2, 6],3
출력
[10, 11, 12]