1101. The Earliest Moment When Everyone Become Friends
1101. The Earliest Moment When Everyone Become Friends
這個題目是我認為很好的一道面試題,因為題目的情景很貼近日常生活,所以很容易放在各種公司產品的情境。
LeetCode 的官方答案是使用 Union Find 來實作,但是我覺得這樣的實作方法很不容易在面試中想到並且解釋的清楚。
我的思考模式是其實很簡單,已知是為兩兩在何時成為朋友,而如果 A 和 B 與 C 都是朋友,其中 A 和 B 在 0 這個時間點成為朋友 B 和 C 在 1 這個時間點成為朋友,A 和 C 在 2 這個時間點成為朋友,也就是說在 1 這個時間點, A、B、C 已經完全連接了,其中雖然最終 A 可以有和 C 的連接,但是透過 DFS 或是 BFS ,只要終究可以造訪完所有節點,就可以確認某個時間點是已經可以全部連結的。
class Solution:
def earliestAcq(self, logs: List[List[int]], n: int) -> int:
timestamps = [log[0] for log in logs]
timestamps.sort()
graph = defaultdict(list)
for log in logs:
graph[log[1]].append((log[2], log[0]))
graph[log[2]].append((log[1], log[0]))
def dfs(curr, visited, timestamp):
visited.add(curr)
for node, time in graph[curr]:
// 兩個人認識的時間要在目前想要確認的時間點之前或是同時,才算是已經是朋友了,這時候才有走 DFS 的必要。
if node not in visited and time <= timestamp:
dfs(node, visited, timestamp)
for timestamp in timestamps:
visited = set()
dfs(0, visited, timestamp)
if len(visited) == n:
return timestamp
return -1