游戏队友搜索题目解析 | 豆包MarsCode AI刷题

103 阅读3分钟

问题背景

在一款多人游戏中,每场比赛由多个玩家参与。通过分析玩家的比赛历史记录,可以找到与某玩家关系密切的队友。队友的定义为:至少与目标玩家共同参与过两场比赛。

目标

给定一个玩家ID(目标玩家),需要在比赛记录中找到所有符合条件的队友,并按玩家ID升序排列输出。

输入说明

  1. id:目标玩家的唯一标识(整数)。
  2. num:比赛记录的条目数(整数)。
  3. array:比赛记录的二维列表,格式为 [玩家ID, 游戏ID],表示某个玩家参与了某场比赛。

输出说明

返回一个列表,包含所有符合条件的队友的玩家ID。 若没有符合条件的队友,则返回空列表。


关键点分析

  1. 比赛记录结构

    • 每条记录表示某个玩家参加了一场比赛。
    • 记录中同一场比赛可能出现多个玩家。
    • 数据的核心是找到哪些玩家与目标玩家共享了至少两场比赛。
  2. 队友关系的定义

    • 两名玩家是队友的条件是至少共同参与了两场比赛。
  3. 数据处理的核心思路

    • 根据比赛记录,找到每个玩家参与的比赛集合。
    • 对目标玩家的比赛集合,与其他玩家的比赛集合进行比较,统计共同参与的比赛次数。
    • 筛选出共同比赛次数大于等于2的玩家。
  4. 输出要求

    • 将符合条件的玩家ID按照升序排列输出。

解题步骤

  1. 建立玩家与比赛的关系映射

    • 遍历比赛记录,将每个玩家与其参与的比赛记录下来。 例如,记录为:player_games[player_id] = {game_id_1, game_id_2, ...}
  2. 计算目标玩家的共同比赛次数

    • 取出目标玩家参与的比赛集合。
    • 遍历其他玩家的比赛集合,与目标玩家的集合进行交集运算,计算共同比赛的次数。
  3. 筛选队友

    • 如果共同参与的比赛次数 >= 2,则将该玩家视为目标玩家的队友。
  4. 输出排序

    • 将所有符合条件的玩家ID升序排列后返回。

边界情况

  1. 目标玩家未参与任何比赛

    • 如果目标玩家的比赛集合为空,直接返回空列表。
  2. 没有符合条件的队友

    • 如果没有任何玩家满足共同比赛次数 >= 2,返回空列表。
  3. 数据规模较大

    • 如果比赛记录的数量较多,需要高效处理以避免性能问题。

复杂度分析

  1. 时间复杂度

    • 构建玩家与比赛的映射:遍历 array 一次,时间复杂度为O(n)。
    • 比较目标玩家与其他玩家的比赛集合:假设玩家数量为 m,目标玩家的比赛数量为 k,复杂度为 O(m⋅k)。
    • 综合复杂度为 O(n+m⋅k)。
  2. 空间复杂度

    • 使用哈希表存储玩家与比赛的映射,空间复杂度为 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