小M希望通过查看往届游戏比赛的排名来确定自己比赛的目标分数。具体规则如下:
如果分数中有三个或以上不同的分数,返回其中第三大的分数。 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。 为了实现这个目标,我们需要对给定的分数数组进行处理,以找到满足上述条件的目标分数。 解决方案 步骤一:去重和排序 我们需要对分数数组进行去重和排序操作。去重是为了确保我们只考虑不同的分数,而排序是为了方便我们找到第三大的分数。 去重:使用 Set 数据结构来去除重复的分数。Set 的插入操作的时间复杂度是 O(1),因此整体去重的时间复杂度是 O(n),其中 n 是数组的长度。 排序:对去重后的分数进行排序,按照从大到小的顺序排列。排序的时间复杂度是 O(k log k),其中 k 是去重后不同分数的数量。最坏情况下,k 的值最大为 n。 步骤二:判断并返回目标分数 根据去重后的分数数量,我们可以判断并返回目标分数: 如果去重后的分数有三个或更多,返回第三大的分数。 如果去重后的分数少于三个,返回最大的分数。 代码实现 以下是具体的 Java 代码实现: import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class Main { public static int solution(int n, int[] nums) { // 使用 HashSet 去重 Set uniqueScores = new HashSet<>(); for (int score : nums) { uniqueScores.add(score); }
// 将去重后的分数转换为数组并排序
Integer[] sortedScores = uniqueScores.toArray(new Integer[0]);
Arrays.sort(sortedScores, java.util.Collections.reverseOrder());
// 根据去重后的分数数量返回结果
if (sortedScores.length >= 3) {
return sortedScores[2]; // 返回第三大的分数
} else {
return sortedScores[0]; // 返回最大分数
}
}
public static void main(String[] args) {
System.out.println(solution(3, new int[]{3, 2, 1}) == 1); // 输出:true
System.out.println(solution(2, new int[]{1, 2}) == 2); // 输出:true
System.out.println(solution(4, new int[]{2, 2, 3, 1}) == 1); // 输出:true
}
} 图解 假设我们有以下输入:
输入:n = 4, nums = [2, 2, 3, 1] 步骤一:去重和排序 去重:
原始数组:[2, 2, 3, 1] 去重后:[2, 3, 1] 排序:
排序后的数组:[3, 2, 1] 步骤二:判断并返回目标分数 去重后的数组长度为 3,大于等于 3,因此返回第三大的分数,即排序后的第三个元素(从大到小)。 因此,输出结果为:1
时间复杂度分析 去重操作使用 Set,整体时间复杂度是 O(n)。 排序操作的时间复杂度是 O(k log k),其中 k 是去重后不同分数的数量。 总体的时间复杂度是 O(n + k log k),在最坏情况下为 O(n log n)。 通过上述步骤和代码实现,我们可以有效地帮助小M找到他的目标分数。