游戏排名第三大的分数
问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
请你帮小M根据给定的分数数组计算目标分数。
测试样例
样例1:
输入:
n = 3,nums = [3, 2, 1]
输出:1
样例2:
输入:
n = 2,nums = [1, 2]
输出:2
样例3:
输入:
n = 4,nums = [2, 2, 3, 1]
输出:1
题解
为了帮助小M找到目标分数,我们设计了一个高效的算法,该算法充分利用了 TreeSet 数据结构的特性,结合自动去重和排序的功能,使得问题的解决变得简洁而高效。
算法步骤详解
-
去重并排序:
由于分数数组可能包含重复分数,且我们需要按照分数大小排序,TreeSet是一种非常合适的数据结构。TreeSet会自动去掉重复的分数,同时将分数按照从小到大的顺序存储,无需手动进行排序操作。- 例如,对于数组
[2, 2, 3, 1],经过TreeSet处理后,将变为{1, 2, 3}。
-
判断集合大小:
根据题目规则:- 如果不同的分数少于三个(集合大小小于 3),直接返回集合中的最大值。
- 使用
set.last()方法可以直接获取TreeSet中的最大值。例如,对于{1, 2},最大值为2。
-
返回第三大的值:
如果集合大小大于等于 3,则需要返回第三大的分数:- 由于
TreeSet是有序集合,我们可以将其转换为数组(通过set.toArray(new Integer[0])),然后访问倒数第三个元素。 - 假设集合为
{1, 2, 3, 4, 5},转换为数组后是[1, 2, 3, 4, 5],倒数第三个元素即为3。
- 由于
Java 实现
import java.util.TreeSet;
public class Main {
public static int solution(int n, int[] nums) {
// 使用 TreeSet 来存储不同的分数
TreeSet<Integer> set = new TreeSet<>();
for (int num : nums) {
set.add(num);
}
// 如果集合大小小于3,返回最大值
if (set.size() < 3) {
return set.last(); // last() 返回集合中的最大值
}
// 返回第三大的值
// 使用 toArray 方法获取倒数第三个元素
Integer[] array = set.toArray(new Integer[0]);
return array[array.length - 3];
}
public static void main(String[] args) {
System.out.println(solution(3, new int[]{3, 2, 1}) == 1);
System.out.println(solution(2, new int[]{1, 2}) == 2);
System.out.println(solution(4, new int[]{2, 2, 3, 1}) == 1);
}
}
关键步骤
- 使用
TreeSet来存储不同的分数:这样可以自动去重并按升序排序。 - 判断集合大小:如果集合的大小小于3,直接返回集合中的最大值。
- 返回第三大的值:如果集合的大小大于等于3,返回集合中的倒数第三个元素。