package LESSION.Test;
/*程序问题注释开始
程序的版权和版本声明部分
Copyright © 2024,DNUI-stu
All rights reserved.
文件名称: Leetcode练习题
作 者: 山北为谷
完成日期: 2024 年 08月 20日
版 本 号: 001
对任务及求解方法的描述部分
问题描述:
给你一个整数 n ,表示在一个游戏中的玩家数目。
同时给你一个二维整数数组 pick ,其中 pick[i] = [xi, yi] 表示玩家 xi 获得了一个颜色为 yi 的球。
如果玩家 i 获得的球中任何一种颜色球的数目 严格大于 i 个,那么我们说玩家 i 是胜利玩家。换句话说:
如果玩家 0 获得了任何的球,那么玩家 0 是胜利玩家。
如果玩家 1 获得了至少 2 个相同颜色的球,那么玩家 1 是胜利玩家。
...
如果玩家 i 获得了至少 i + 1 个相同颜色的球,那么玩家 i 是胜利玩家。
请你返回游戏中 胜利玩家 的数目。
注意,可能有多个玩家是胜利玩家。
示例 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 是胜利玩家,因为玩家 2 获得了 3 个颜色为 4 的球。
提示:
2 <= n <= 10
1 <= pick.length <= 100
pick[i].length == 2
0 <= xi <= n - 1
0 <= yi <= 10
*/
public class J0601 {
public int countWinners(int n, int[][] pick) {
// 初始化颜色计数数组,长度为11,因为颜色编号从0到10
int[][] colorCounts = new int[n][11];
// 统计每个玩家每种颜色的球的数量
for (int[] p : pick) {
int player = p[0];
int color = p[1];
colorCounts[player][color]++;
}
int winners = 0;
// 遍历每个玩家
for (int i = 0; i < n; i++) {
// 遍历每种颜色
for (int j = 0; j < 11; j++) {
// 如果某种颜色被当前玩家选择的次数严格大于其玩家编号,则该玩家是胜利玩家
if (colorCounts[i][j] > i) {
winners++;
break; // 一旦找到一种符合条件的颜色,就跳出内层循环,继续检查下一个玩家
}
}
}
return winners;
}
//简洁题解:
class Solution {
public int winningPlayerCount(int n, int[][] pick) {
int[][] m = new int[n][11];
for (int[] c : pick) {
m[c[0]][c[1]]++;
}
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int color : m[i]) {
if (color > i) {
++ans;
break;
}
}
}
return ans;
}
}
//测试案例1
public static void main(String[] args) {
J0601 solution = new J0601();
int n = 4;
int[][] pick = {{0, 0}, {1, 0}, {1, 0}, {2, 1}, {2, 1}, {2, 0}};
System.out.println(solution.countWinners(n, pick)); // 输出: 2
System.out.println("\n");
Solution solution1 = new J0601().new Solution();
System.out.println(solution1.winningPlayerCount(n, pick)); // 输出: 2
}
}
//分析:
/*
为了解决这个问题,我们可以使用一个长度为11(因为颜色编号是从0到10)的数组来跟踪每种颜色被不同玩家选择的次数。
然后,我们可以遍历每个玩家,检查是否存在至少一种颜色,该颜色被该玩家选择的次数严格大于其玩家编号。
这段代码首先通过两层循环统计了每个玩家每种颜色的球的数量。然后,它再次遍历每个玩家和每种颜色,
检查是否存在至少一种颜色被该玩家选择的次数严格大于其玩家编号。
如果是这样,就增加胜利玩家的计数器,并跳出内层循环以继续检查下一个玩家。最后,返回胜利玩家的数量
*/
给你一个整数 n
,表示在一个游戏中的玩家数目。同时给你一个二维整数数组 pick
,其中 pick[i] = [xi, yi]
表示玩家 xi
获得了一个颜色为 yi
的球。
如果玩家 i
获得的球中任何一种颜色球的数目 严格大于 i
个,那么我们说玩家 i
是胜利玩家。换句话说:
- 如果玩家 0 获得了任何的球,那么玩家 0 是胜利玩家。
- 如果玩家 1 获得了至少 2 个相同颜色的球,那么玩家 1 是胜利玩家。
- ...
- 如果玩家
i
获得了至少i + 1
个相同颜色的球,那么玩家i
是胜利玩家。
请你返回游戏中 胜利玩家 的数目。
注意,可能有多个玩家是胜利玩家。
示例 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 是胜利玩家,因为玩家 2 获得了 3 个颜色为 4 的球。
提示:
2 <= n <= 10
1 <= pick.length <= 100
pick[i].length == 2
0 <= xi <= n - 1
0 <= yi <= 10
题目来自Leetcode 3238【求出胜利玩家的数目】