Easy
题目描述
给你一个整数 n,表示游戏中玩家的数量,以及一个二维数组 pick,其中 pick[i] = [xi, yi] 表示玩家 xi 拾取了一个颜色为 yi 的球。
如果玩家 i 拾取了严格超过 i 个相同颜色的球,那么玩家 i 获胜。换句话说:
- 玩家 0 拾取任意一个球就获胜
- 玩家 1 拾取至少 2 个相同颜色的球就获胜
- …
- 玩家 i 拾取至少 i + 1 个相同颜色的球就获胜
返回获胜玩家的数量。
注意多个玩家可以获胜。
示例 1:
输入:n = 4, pick = [[0,0],[1,0],[1,0],[2,1],[2,1],[2,0]]
输出:2
解释:玩家 0 和玩家 1 获胜,而玩家 2 和 3 没有获胜。
示例 2:
输入:n = 5, pick = [[1,1],[1,2],[1,3],[1,4]]
输出:0
解释:没有玩家获胜。
示例 3:
输入:n = 5, pick = [[1,1],[2,4],[2,4],[2,4]]
输出:1
解释:玩家 2 通过拾取 3 个颜色为 4 的球获胜。
提示:
2 <= n <= 101 <= pick.length <= 100pick[i].length == 20 <= xi <= n - 10 <= yi <= 10
解题思路
这道题需要统计每个玩家拾取每种颜色球的数量,然后判断是否满足获胜条件。
解题思路:
数据统计:使用哈希表记录每个玩家拾取每种颜色球的数量。可以用二维数组或者嵌套哈希表来实现。
获胜条件判断:对于玩家 i,需要检查是否存在某种颜色的球,其拾取数量严格大于 i(即至少 i+1 个)。
遍历检查:遍历所有玩家,对每个玩家检查其拾取的所有颜色中是否有满足获胜条件的。
算法步骤:
- 创建二维计数数组
count[player][color]记录每个玩家拾取每种颜色的球数 - 遍历 pick 数组,统计每个操作
- 对每个玩家,检查是否存在某种颜色的球数量 > 玩家编号
- 统计获胜玩家数量
由于数据规模很小(n≤10,颜色≤10),直接使用二维数组是最简洁高效的方法。
代码实现
class Solution {
public:
int winningPlayerCount(int n, vector<vector<int>>& pick) {
vector<vector<int>> count(n, vector<int>(11, 0));
for (auto& p : pick) {
count[p[0]][p[1]]++;
}
int winners = 0;
for (int i = 0; i < n; i++) {
for (int color = 0; color <= 10; color++) {
if (count[i][color] > i) {
winners++;
break;
}
}
}
return winners;
}
};
class Solution:
def winningPlayerCount(self, n: int, pick: List[List[int]]) -> int:
count = [[0] * 11 for _ in range(n)]
for player, color in pick:
count[player][color] += 1
winners = 0
for i in range(n):
for color in range(11):
if count[i][color] > i:
winners += 1
break
return winners
public class Solution {
public int WinningPlayerCount(int n, int[][] pick) {
int[,] count = new int[n, 11];
foreach (var p in pick) {
count[p[0], p[1]]++;
}
int winners = 0;
for (int i = 0; i < n; i++) {
for (int color = 0; color <= 10; color++) {
if (count[i, color] > i) {
winners++;
break;
}
}
}
return winners;
}
}
var winningPlayerCount = function(n, pick) {
const count = Array.from({ length: n }, () => Array(11).fill(0));
for (const [player, color] of pick) {
count[player][color]++;
}
let winners = 0;
for (let i = 0; i < n; i++) {
for (let color = 0; color <= 10; color++) {
if (count[i][color] > i) {
winners++;
break;
}
}
}
return winners;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(m + n) | m 是 pick 数组长度,n 是玩家数量。遍历 pick 数组需要 O(m),检查每个玩家需要 O(n×11) = O(n) |
| 空间复杂度 | O(n) | 需要 n×11 的二维数组存储计数信息 |
相关题目
. Can I Win (Medium)
. Predict the Winner (Medium)