解题思路:
1. 构建并查集
2. 判断区域是否重叠
3. 合并, 人数相加,新冠传递,坐标叠加
4. 返回新冠集合中的人数
class Pos:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return "x={},y={}".format(self.x, self.y)
class Node:
def __init__(self, pos, has_COV19):
self.pos = pos
self.man = 1 # 人数
self.has_COV19 = has_COV19 # 1表示得新冠,0表示未得新冠
def union(self, node):
self.pos.x = min(self.pos.x, node.pos.x)
self.pos.y = max(self.pos.y, node.pos.y)
self.has_COV19 += node.has_COV19
self.man += node.man
def find(self, node):
range_1 = self.pos.y - self.pos.x
range_2 = node.pos.y - node.pos.x
range_3 = max(self.pos.y, node.pos.y) - min(self.pos.x, node.pos.x)
return (range_1 + range_2) >= range_3
def __repr__(self):
return "pos={},man={},COV={}".format(self.pos, self.man, self.has_COV19)
class BCJSet:
def __init__(self):
self.bcj_set = list()
def add(self, node:Node):
""" 添加结点 """
find_id = -1
for i in range(len(self.bcj_set)):
if node.find(self.bcj_set[i]):
find_id = i
self.bcj_set[i].union(node)
break
if find_id == -1: # 没有合并
self.bcj_set.append(node)
else: # 有合并
curr_node = self.bcj_set.pop(find_id)
next_find_id = -1
for i in range(len(self.bcj_set)):
if curr_node.find(self.bcj_set[i]):
next_find_id = i
self.bcj_set[i].union(curr_node)
break
if next_find_id == -1:
self.bcj_set.append(curr_node)
def get_rnt(self):
for i in range(len(self.bcj_set)):
if self.bcj_set[i].has_COV19 == 1:
return self.bcj_set[i].man
return 0
def __repr__(self):
return "&".join([str(tmp) for tmp in self.bcj_set])
class Solution:
def CatchVirus(self , Personid , PeoplePosition ):
# write code here
bcj_set = BCJSet()
for i in range(len(PeoplePosition)):
bcj_set.add(Node(PeoplePosition[i], 1 if i == Personid else 0))
# print(bcj_set)
return bcj_set.get_rnt()


京公网安备 11010502036488号