2471. 레벨별로 이진 트리를 정렬하기 위한 최소 작업 횟수
난이도:중
주제: 트리, 너비 우선 검색, 이진 트리
고유한 값을 가진 이진 트리의 루트가 제공됩니다.
한 번의 작업으로 동일한 레벨 두 개의 노드를 선택하고 해당 값을 교환할 수 있습니다.
각 수준의 값을 엄밀히 증가하는 순서로 정렬하는 데 필요한 최소 작업 수를 반환합니다.
노드의 레벨은 해당 노드와 루트 노드 사이의 경로를 따라 있는 에지 수입니다.
예 1:
예 2:
예 3:
제약조건:
힌트:
해결책:
문제는 이진 트리의 값을 최소한의 연산 횟수로 엄격한 오름차순으로 레벨별로 정렬하는 것입니다. 각 작업에서 동일한 레벨에 있는 두 노드의 값을 교환할 수 있습니다. 목표는 정렬된 순서를 달성하는 데 필요한 최소 작업 수를 결정하는 것입니다.
이 솔루션을 PHP로 구현해 보겠습니다: 2471. 이진 트리를 수준별로 정렬하기 위한 최소 작업 횟수
<?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?> <h3> 설명: </h3> <ol> <li> <p><strong>1단계: BFS를 수행하여 수준별로 노드를 그룹화합니다</strong>:</p> <ul> <li>루트에서 시작하여 레벨별로 트리 레벨을 탐색합니다.</li> <li>각 노드에 대해 레벨 배열의 해당 레벨에 해당 값을 추가합니다.</li> </ul> </li> <li> <p><strong>2단계: 각 레벨에 대해 최소 스왑을 계산하여 값을 정렬합니다</strong>:</p> <ul> <li>각 수준의 값을 정렬합니다.</li> <li>주기 기반 접근 방식을 사용하여 현재 레벨을 정렬된 레벨로 변환하는 데 필요한 최소 스왑을 계산합니다.</li> </ul> </li> <li> <p><strong>주기 분해</strong>:</p> <ul> <li>정렬되지 않은 각 요소에 대해 주기(즉, 어디로 가야 하는지)를 추적하고 요소를 방문한 것으로 표시합니다.</li> <li>각 주기마다 필요한 교체 횟수는 주기 길이에서 1을 뺀 값입니다.</li> </ul> </li> <li> <p><strong>총 스왑 횟수 반환</strong>:</p> <ul> <li>각 레벨에 필요한 스왑을 합산하여 그 합계를 반환합니다.</li> </ul> </li> </ol> <h3> 예제 연습: </h3> <h4> 예시 1: </h4> <p>입력 트리:<br> </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?>
레벨:
레벨 1: [4, 3]
레벨 2: [7, 6, 8, 5]
레벨 3: [9, 10]
총 스왑 = 1(레벨 1) 2(레벨 2) = 3 스왑
출력: 3
입력 트리:
1 / \ 4 3 / \ / \ 7 6 8 5 \ 9 \ 10
레벨:
레벨 1: [3, 2]
레벨 2: [7, 6, 5, 4]
총 스왑 = 1(레벨 1) 2(레벨 2) = 3 스왑
출력: 3
따라서 전체 시간 복잡도는 O(N log N)이며, 이는 제약 조건을 고려하면 충분히 효율적입니다.
입력 트리의 경우:
<?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?>
예제에 자세히 설명된 대로 출력은 3개의 스왑입니다.
이 솔루션은 BFS를 사용하여 레벨 및 사이클 분해별로 노드를 그룹화하여 스왑 수를 최소화함으로써 이진 트리의 각 레벨을 정렬하는 데 필요한 최소 스왑 수를 효율적으로 계산합니다. O(N log N)의 시간 복잡도는 최대 10^5개 노드
가 있는 트리를 처리하는 데 최적입니다.연락처 링크
이 시리즈가 도움이 되었다면 GitHub에서 저장소에 별표를 표시하거나 즐겨찾는 소셜 네트워크에서 게시물을 공유해 보세요. 여러분의 지원은 저에게 큰 의미가 될 것입니다!
이렇게 더 유용한 콘텐츠를 원하시면 저를 팔로우해주세요.
위 내용은 수준별로 이진 트리를 정렬하기 위한 최소 작업 수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!