Skip to content

Commit dd1f653

Browse files
committed
Dec 24
1 parent 2d50533 commit dd1f653

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from collections import deque
2+
from math import ceil
3+
from typing import List, Tuple
4+
5+
6+
class Solution:
7+
def __build_adj_list(self, n: int, edges: List[int]) -> List[List[int]]:
8+
adj_list = [[] for _ in range(n)]
9+
for u, v in edges:
10+
adj_list[u].append(v)
11+
adj_list[v].append(u)
12+
return adj_list
13+
14+
def __find_diameter(self, n: int, adj_list: List[List[int]]) -> int:
15+
farthest_node, _ = self.__find_farthest_node(n, adj_list)
16+
_, diameter = self.__find_farthest_node(n, adj_list, farthest_node)
17+
return diameter
18+
19+
def __find_farthest_node(
20+
self, n: int, adj_list: List[List[int]], source_node: int = 0
21+
) -> Tuple[int, int]:
22+
queue = deque([source_node])
23+
visited = [i == source_node for i in range(n)]
24+
25+
max_distance = 0
26+
farthest_node = source_node
27+
28+
while queue:
29+
for _ in range(len(queue)):
30+
current_node = queue.popleft()
31+
farthest_node = current_node
32+
for neighbor in adj_list[current_node]:
33+
if not visited[neighbor]:
34+
visited[neighbor] = True
35+
queue.append(neighbor)
36+
if queue:
37+
max_distance += 1
38+
39+
return farthest_node, max_distance
40+
41+
def minimumDiameterAfterMerge(self, edges1: List[List[int]], edges2: List[List[int]]) -> int:
42+
n, m = len(edges1) + 1, len(edges2) + 1
43+
44+
adj_list1 = self.__build_adj_list(n, edges1)
45+
adj_list2 = self.__build_adj_list(m, edges2)
46+
47+
diameter1 = self.__find_diameter(n, adj_list1)
48+
diameter2 = self.__find_diameter(m, adj_list2)
49+
50+
combined_diameter = ceil(diameter1 / 2) + ceil(diameter2 / 2) + 1
51+
return max(diameter1, diameter2, combined_diameter)
52+
53+
54+
def main():
55+
edges1 = [[0, 1], [0, 2], [0, 3]]
56+
edges2 = [[0, 1]]
57+
assert Solution().minimumDiameterAfterMerge(edges1, edges2) == 3
58+
59+
edges1 = [[0, 1], [0, 2], [0, 3], [2, 4], [2, 5], [3, 6], [2, 7]]
60+
edges2 = [[0, 1], [0, 2], [0, 3], [2, 4], [2, 5], [3, 6], [2, 7]]
61+
assert Solution().minimumDiameterAfterMerge(edges1, edges2) == 5
62+
63+
64+
if __name__ == '__main__':
65+
main()

2024-12-December-LeetCoding-Challenge/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
| December 21 | [2872. Maximum Number of K-Divisible Components](https://leetcode.com/problems/maximum-number-of-k-divisible-components/) | Hard | Unsolved |
2727
| December 22 | [2940. Find Building Where Alice and Bob Can Meet](https://leetcode.com/problems/find-building-where-alice-and-bob-can-meet/) | Hard | Unsolved |
2828
| December 23 | [2471. Minimum Number of Operations to Sort a Binary Tree by Level](https://leetcode.com/problems/minimum-number-of-operations-to-sort-a-binary-tree-by-level/) | Medium | Solved |
29-
| December 24 | []() | | |
29+
| December 24 | [3203. Find Minimum Diameter After Merging Two Trees](https://leetcode.com/problems/find-minimum-diameter-after-merging-two-trees/) | Hard | Unsolved |
3030
| December 25 | []() | | |
3131
| December 26 | []() | | |
3232
| December 27 | []() | | |
@@ -40,4 +40,4 @@
4040
| --- | --- | --- | --- |
4141
| Easy | 5 | 5 | 0 |
4242
| Medium | 16 | 10 | 6 |
43-
| Hard | 2 | 0 | 2 |
43+
| Hard | 3 | 0 | 3 |

0 commit comments

Comments
 (0)