捕获敌人 | 豆包MarsCode AI刷题

69 阅读3分钟

小S在玩一个捕获敌人的游戏,她可以使用一次全屏技能来捕获尽可能多的敌人。要使捕获成功,敌人的横坐标之间的最大差值不能超过参数A,纵坐标之间的最大差值不能超过参数B。现在给出所有敌人的坐标,计算小S一次性最多可以捕获多少个敌人。 例如,小S面对3个敌人,其坐标为 [1, 1],[1, 2] 和 [1, 3],当她设置技能的参数 A 为 1,B 为 1 时,最多可以同时捕获2个敌人。

  1. 初始化最大捕获敌人数量变量

    • 首先初始化变量 max_count 为 0,用于记录小 S 一次性最多可以捕获的敌人数量,后续会通过遍历各种情况并比较来不断更新这个变量,以找到最大值。
  2. 双重循环遍历坐标组合确定范围

    • 通过两层嵌套的循环来遍历所有敌人坐标的两两组合情况。外层循环控制起始索引 i,范围从 0 到 N - 1N 为敌人的数量),内层循环控制结束索引 j,范围从 i 到 N - 1,这样可以避免重复计算每一对坐标组合(比如 (i, j) 和 (j, i) 只计算一次)。
    • 对于每一对坐标组合 (coordinates[i], coordinates[j]),分别找出它们横坐标的最小值 min_x 和最大值 max_x,以及纵坐标的最小值 min_y 和最大值 max_y,通过使用 min 和 max 函数来实现(例如 min_x = min(coordinates[i][0], coordinates[j][0]),这里 coordinates[i][0] 和 coordinates[j][0] 分别是两个坐标的横坐标),确定了一个可能的捕获范围(以这两个坐标为对角顶点形成的矩形区域)。
  3. 内层循环判断其他敌人是否在范围内并计数

    • 初始化一个变量 count 为 0,用于记录在当前确定的捕获范围内的敌人数量。通过一个内层循环遍历所有 N 个敌人的坐标(索引 k 从 0 到 N - 1),对于每个敌人的坐标 (x, y)(通过 x = coordinates[k][0] 和 y = coordinates[k][1] 获取),判断它是否在前面确定的捕获范围内(横坐标满足 min_x <= x <= max_x,纵坐标满足 min_y <= y <= max_y),并且还要判断这个范围的横坐标差值 max_x - min_x 是否不超过参数 A,纵坐标差值 max_y - min_y 是否不超过参数 B,如果都满足这些条件,说明该敌人在可捕获范围内,将 count 加 1。
  4. 更新最大捕获敌人数量变量

    • 在经过内层循环统计完当前捕获范围内的敌人数量 count 后,将 count 与当前记录的最大捕获敌人数量 max_count 进行比较,使用 max 函数取两者中的较大值来更新 max_count,这样不断遍历所有坐标组合情况并比较更新,就能找到在给定参数 A 和 B 限制下一次性最多可以捕获的敌人数量。
  5. 返回最终结果

    • 当两层嵌套循环遍历完所有敌人坐标的组合情况后,max_count 变量中存储的就是小 S 一次性最多可以捕获的敌人数量,将其返回即可。

时间复杂度方面,外层循环遍历坐标组合的时间复杂度为 (N 为敌人数量,外层循环 N 次,内层循环最多 N 次),内层循环遍历所有敌人判断是否在范围内的时间复杂度为 ,在循环中进行的操作主要是简单的比较和赋值操作,时间复杂度都是常数级别,综合起来整体时间复杂度为 ,在处理常规数量的敌人以及给定的参数 A 和 B 时能够通过穷举所有可能情况来计算出最多可捕获的敌人数量。