Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 합이 가장 큰 k 하위 목록을 찾고 합계를 오름차순으로 반환하는 프로그램

<시간/>

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]) 삽입
  • 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]