题解 | #小米Git#
小米Git
https://www.nowcoder.com/practice/4fcd94851d9142458329fd1d3e5802a8
# -*- coding:utf-8 -*-
from typing import List
class Solution:
global List
def Git(self, matrix: List[str], versionA: int, versionB: int) -> int:
# write code here
# 首先将每个节点的邻接节点识别出来
neigh_set = dict()
for i in range(len(matrix)):
neigh_set[i] = self.get_neighbor(matrix[i])
self.search(neigh_set, versionA, 0, 0, [])
a_path = a_list
self.search(neigh_set, versionB, 0, 0, [])
b_path = a_list
for i in range(min(len(a_path), len(b_path))):
if a_path[i] != b_path[i]:
return a_path[i - 1]
break
else:
if i == min(len(a_path), len(b_path)) - 1:
return a_path[i]
# 识别相连节点
def get_neighbor(self, char: str) -> list:
neighbor = []
for i in range(len(char)):
if char[i] == "1":
neighbor.append(i)
return neighbor
# 从根节点开始搜索给定的节点,深度优先
# 为了防止重复搜索: 1)构建邻接节点字典时只考虑子节点,不考虑父节点
# 2)搜索时记录下之前的节点,例如从1-2时,2-1时跳过
def search(
self, adj: dict, tar: int, pre_node: int, current_node: int, path: list
) -> list:
"""
adj:{0:[1,2,3],
1:[0],
...
}
"""
global flag
flag = 0
if current_node == tar:
path.append(current_node)
global a_list
a_list = path.copy()
flag = 1
else:
for node in adj[current_node]:
if node != pre_node:
path.append(current_node)
self.search(adj, tar, current_node, node, path)
path.pop()
if flag:
break
海康威视公司福利 1272人发布