求出胜利玩家的数目

本文最后更新于:2024年11月23日 下午

3238. 求出胜利玩家的数目

level: easy

tag:数组 哈希表 计数

给你一个整数 n ,表示在一个游戏中的玩家数目。同时给你一个二维整数数组 pick ,其中 pick[i] = [xi, yi] 表示玩家 xi 获得了一个颜色为 yi 的球。

如果玩家 i 获得的球中任何一种颜色球的数目 严格大于 i 个,那么我们说玩家 i 是胜利玩家。换句话说:

如果玩家 0 获得了任何的球,那么玩家 0 是胜利玩家。
如果玩家 1 获得了至少 2 个相同颜色的球,那么玩家 1 是胜利玩家。

如果玩家 i 获得了至少 i + 1 个相同颜色的球,那么玩家 i 是胜利玩家。
请你返回游戏中 胜利玩家 的数目。

注意,可能有多个玩家是胜利玩家。

示例 1:

1
2
3
4
5
6
7
8
9
10
11
给你一个整数 n ,表示在一个游戏中的玩家数目。同时给你一个二维整数数组 pick ,其中 pick[i] = [xi, yi] 表示玩家 xi 获得了一个颜色为 yi 的球。

如果玩家 i 获得的球中任何一种颜色球的数目 严格大于 i 个,那么我们说玩家 i 是胜利玩家。换句话说:

如果玩家 0 获得了任何的球,那么玩家 0 是胜利玩家。
如果玩家 1 获得了至少 2 个相同颜色的球,那么玩家 1 是胜利玩家。
...
如果玩家 i 获得了至少 i + 1 个相同颜色的球,那么玩家 i 是胜利玩家。
请你返回游戏中 胜利玩家 的数目。

注意,可能有多个玩家是胜利玩家。

题解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function winningPlayerCount(n: number, pick: number[][]): number {
const map = new Map();
const res = new Map();

pick.forEach((item) => {
if (map.has(item[0])) {
const obj = map.get(item[0]);
if (obj.hasOwnProperty(item[1])) {
++obj[item[1]];
} else {
obj[item[1]] = 1;
}

if (obj[item[1]] > item[0] && !res.has(item[0])) {
res.set(item[0], 1);
}
map.set(item[0], obj);
} else {
const key = item[1];
if (item[0] === 0) {
res.set(item[0], 1);
}
map.set(item[0], { [key]: 1 });
}
});
return res.size;
}

思路:

  1. 遍历数组,将每个玩家的球的颜色和数量存入 map 中,其中 key 为玩家 id,value 为对象,对象的 key 为球的颜色,value 为该颜色球的数量
  2. 判断每个玩家是否满足胜利条件,如果满足则存入 res 中,res 使用了 map 数据结构,避免重复统计
  3. 返回 res 的长度

复杂度

m 为 pick 数组的长度, n 为 结果的长度

时间复杂度:O(m)

空间复杂度:O(n+m)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!