셀이라고 하는 숫자 목록이 있다고 가정합니다. 이 목록은 다른 셀의 크기를 나타냅니다. 이제 각 반복에서 두 개의 가장 큰 셀과 b는 다음 규칙에 따라 상호 작용합니다. 따라서 =b이면 둘 다 죽습니다. 그렇지 않으면 두 셀이 병합되고 크기가 ((a + b) / 3)의 바닥이 됩니다. 마지막 셀의 크기를 찾거나 남은 셀이 없으면 -1을 반환해야 합니다.
따라서 입력이 [20,40,40,30]과 같으면 출력은 16이 되고 첫 번째 반복에서는 40과 40이 죽고 20과 30은 ((20+30) / 3)의 바닥이 됩니다. =50/3의 바닥 =16
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
cells :=셀 배열의 각 값을 음수로 변환
-
셀로 힙 만들기
-
셀이 비어 있지 않은 동안 수행 -
-
셀에서 두 요소를 삭제하고 다시 음수로 변환하고 연속적으로 첫 번째와 두 번째로 할당
-
-
첫 번째가 두 번째와 같지 않으면 -
-
(첫 번째 + 두 번째)/3) 바닥의 음수를 힙에 삽입
-
-
셀에 일부 요소가 있으면 음수 반환 [0] 그렇지 않으면 1
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
from heapq import heapify, heappop, heappush class Solution: def solve(self, cells): cells=[-x for x in cells] heapify(cells) while len(cells)>1: first,second = -heappop(cells), -heappop(cells) if first!=second: heappush(cells, -((first+second)//3)) return -cells[0] if cells else -1 ob = Solution() cells = [20,40,40,30] print(ob.solve(cells))
입력
[20,40,40,30]
출력
16