问题背景
在一款多人游戏中,每场比赛由多个玩家参与。通过分析玩家的比赛历史记录,可以找到与某玩家关系密切的队友。队友的定义为:至少与目标玩家共同参与过两场比赛。
目标
给定一个玩家ID(目标玩家),需要在比赛记录中找到所有符合条件的队友,并按玩家ID升序排列输出。
输入说明
id:目标玩家的唯一标识(整数)。num:比赛记录的条目数(整数)。array:比赛记录的二维列表,格式为[玩家ID, 游戏ID],表示某个玩家参与了某场比赛。
输出说明
返回一个列表,包含所有符合条件的队友的玩家ID。 若没有符合条件的队友,则返回空列表。
关键点分析
-
比赛记录结构:
- 每条记录表示某个玩家参加了一场比赛。
- 记录中同一场比赛可能出现多个玩家。
- 数据的核心是找到哪些玩家与目标玩家共享了至少两场比赛。
-
队友关系的定义:
- 两名玩家是队友的条件是至少共同参与了两场比赛。
-
数据处理的核心思路:
- 根据比赛记录,找到每个玩家参与的比赛集合。
- 对目标玩家的比赛集合,与其他玩家的比赛集合进行比较,统计共同参与的比赛次数。
- 筛选出共同比赛次数大于等于2的玩家。
-
输出要求:
- 将符合条件的玩家ID按照升序排列输出。
解题步骤
-
建立玩家与比赛的关系映射:
- 遍历比赛记录,将每个玩家与其参与的比赛记录下来。 例如,记录为:
player_games[player_id] = {game_id_1, game_id_2, ...}。
- 遍历比赛记录,将每个玩家与其参与的比赛记录下来。 例如,记录为:
-
计算目标玩家的共同比赛次数:
- 取出目标玩家参与的比赛集合。
- 遍历其他玩家的比赛集合,与目标玩家的集合进行交集运算,计算共同比赛的次数。
-
筛选队友:
- 如果共同参与的比赛次数 >= 2,则将该玩家视为目标玩家的队友。
-
输出排序:
- 将所有符合条件的玩家ID升序排列后返回。
边界情况
-
目标玩家未参与任何比赛:
- 如果目标玩家的比赛集合为空,直接返回空列表。
-
没有符合条件的队友:
- 如果没有任何玩家满足共同比赛次数 >= 2,返回空列表。
-
数据规模较大:
- 如果比赛记录的数量较多,需要高效处理以避免性能问题。
复杂度分析
-
时间复杂度:
- 构建玩家与比赛的映射:遍历
array一次,时间复杂度为O(n)。 - 比较目标玩家与其他玩家的比赛集合:假设玩家数量为 m,目标玩家的比赛数量为 k,复杂度为 O(m⋅k)。
- 综合复杂度为 O(n+m⋅k)。
- 构建玩家与比赛的映射:遍历
-
空间复杂度:
- 使用哈希表存储玩家与比赛的映射,空间复杂度为 O(n)。
代码示例
def solution(id, num, array):
# 初始化字典,用于记录每个玩家与其他玩家的比赛次数
game_count = {}
# 遍历比赛记录
for player, game in array:
if player not in game_count:
game_count[player] = {}
for other_player, other_game in array:
if other_player != player and other_game == game:
if other_player not in game_count[player]:
game_count[player][other_player] = 0
game_count[player][other_player] += 1
# 筛选符合条件的玩家
teammates = []
if game_count.get(id)== None:
return []
for other_player, count in game_count[id].items():
if count >= 2:
teammates.append(other_player)
teammates.sort()
return teammates