问题指路-->小M的比赛胜场计算 - MarsCode
问题描述
小M参加了一场n个人的比赛,比赛规则是所有选手两两对决。每个人有一个能力值,对应着他们的序号。参赛者同时被分为黄色或蓝色两种颜色。比赛胜负的规则如下:
- 当比赛双方颜色不同时,能力值大的选手获胜;
- 当比赛双方颜色相同时,能力值较小的选手获胜。
你需要帮助小M计算每个选手在比赛中能赢得的场数。
测试样例
样例1:
输入:
n = 3, a = [0, 0, 1]
输出:[1, 0, 2]
- 序号0和序号1比赛时,颜色相同,故序号0获胜。
- 序号0和序号2比赛时,颜色不同,故序号2获胜。
- 序号1和序号2比赛时,颜色不同,故序号2获胜。
样例2:
输入:
n = 4, a = [1, 0, 1, 0]
输出:[1, 2, 1, 2]
样例3:
输入:
n = 5, a = [0, 1, 0, 1, 0]
输出:[2, 2, 2, 2, 2]
选手之间的胜负关系根据能力值的奇偶性和大小判断,最终结果为:[2, 2, 2, 2, 2]。
解题思路
假设有 n 个选手,每个选手的能力值存储在数组 a中。a[i] 表示第 i 个选手的能力值。我们需要在所有选手之间进行两两对决,根据比赛规则判断每个选手的胜负情况。
比赛的胜负规则可以总结为:
- 不同颜色:能力值较大的选手获胜。
- 相同颜色:能力值较小的选手获胜。
我们可以通过双层循环遍历每对选手,计算每个选手获胜的次数。 但是需要注意每个选手无法和自己进行比赛,因此需要排除和自己比赛的情况。
完整代码
import java.util.Arrays;
public class Main {
public static int[] solution(int n, int[] a) {
// 结果数组,用来存储每个选手获胜的次数
int[] res = new int[n];
// 双层循环遍历所有选手之间的比赛
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 跳过自己和自己比较
if (i == j) continue;
// 比较选手i和选手j
if (a[i] != a[j]) {
// 如果能力值不同且i > j,i赢
if (i > j) {
res[i]++;
}
} else {
// 如果能力值相同且i < j,i赢
if (i < j) {
res[i]++;
}
}
}
}
return res; // 返回每个选手能赢得的场数
}
public static void main(String[] args) {
// 测试用例1
System.out.println(Arrays.equals(solution(3, new int[]{0, 0, 1}), new int[]{1, 0, 2})); // 输出 [1, 0, 2]
// 测试用例2
System.out.println(Arrays.equals(solution(4, new int[]{1, 0, 1, 0}), new int[]{1, 2, 1, 2})); // 输出 [1, 2, 1, 2]
// 测试用例3
System.out.println(Arrays.equals(solution(5, new int[]{0, 1, 0, 1, 0}), new int[]{2, 2, 2, 2, 2})); // 输出 [2, 2, 2, 2, 2]
}
}
复杂度分析
- 时间复杂度:
- 外层循环和内层循环都遍历 n 个选手,因此时间复杂度为 O(n^2)。
- 空间复杂度:
- 需要一个 res数组来存储每个选手的获胜场数,因此空间复杂度为 O(n)。