Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594
给出一幅有向图的边的连接情况(edges数组包含n个值,edges[i]不等于-1表示存在从i到edges[i]的边),节点编号o~n-1,给出node1,node2两个节点问是否存在一个节点j,使得从node1到j和从node2到j的两个距离中的较大值最小,输出这个节点值,如果不存在,输出-1

DFS分别预处理从node1和node2到每个其他节点的距离,因为原图有环,注意是否已经访问过(看dis数组是否已经更新),然后枚举所有节点,找出是否存在所求节点j


 1 #2359
 2 #Runtime: 1986 ms (Beats 26.67%)
 3 #Memory: 115 MB (Beats 13.33%)
 4 
 5 class Solution(object):
 6     def closestMeetingNode(self, edges, node1, node2):
 7         """
 8         :type edges: List[int]
 9         :type node1: int
10         :type node2: int
11         :rtype: int
12         """
13         
14         def DFS(r, d, dis):
15             if r == -1 or dis[r] != -1:
16                 return
17             dis[r] = d
18             DFS(edges[r], d + 1, dis)
19 
20         n = len(edges)
21         dis1, dis2 = [-1] * n, [-1] * n
22         DFS(node1, 0, dis1)
23         DFS(node2, 0, dis2)
24         min_dis = 100001
25         ans = -1
26         for i in range(n):
27             if min(dis1[i], dis2[i]) >= 0 and max(dis1[i], dis2[i]) < min_dis:
28                 min_dis = max(dis1[i], dis2[i])
29                 ans = i
30         return ans

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理