问题解析
在这道题目中,我们需要在一组给定的分数中找到排名第三的分数,作为目标分数。具体要求如下:
- 如果数组中有三个或以上不同的分数,则返回第三大的分数。
- 如果数组中不同的分数少于三个,则返回最大的分数。
这种问题在数据分析和比赛排名系统中非常常见,可以帮助用户了解排名情况和竞争对手的表现。
解题思路
去重和排序:首先,需要对输入数组进行去重,以便只保留不同的分数。然后,我们将去重后的分数按从大到小的顺序进行排序。
判断条件:
- 如果去重后的分数列表中元素个数大于等于3,返回排名第三的分数。
- 如果去重后的分数少于3个,则返回最大的分数。
实现细节:
- 使用Python内置的
set()函数来去除数组中的重复分数。 - 使用
sorted()函数将去重后的分数列表按降序排列,以便于直接索引第三大的分数。 - 在索引时,使用列表下标
[2]来获取第三大的元素。
代码实现
def solution(n: int, nums: list) -> int:
# 去除重复的分数并按从大到小排序
unique_scores = sorted(set(nums), reverse=True)
# 检查是否有三个或更多不同的分数
if len(unique_scores) >= 3:
return unique_scores[2] # 返回第三大的分数
else:
return unique_scores[0] # 返回最大的分数
# 测试用例
if __name__ == '__main__':
print(solution(3, [3, 2, 1]) == 1)
print(solution(2, [1, 2]) == 2)
print(solution(4, [2, 2, 3, 1]) == 1)
示例分析:
- 样例1:输入
[3, 2, 1]。去重后得到[3, 2, 1],第三大的数是1,输出1。 - 样例2:输入
[1, 2]。去重后得到[2, 1],由于只有两个不同分数,输出最大的分数2。 - 样例3:输入
[2, 2, 3, 1]。去重后得到[3, 2, 1],第三大的数是1,输出1。
复杂度分析:
- 时间复杂度:
O(n log n),其中n是数组的长度。set()去重的时间复杂度为O(n),sorted()排序的时间复杂度为O(n log n)。 - 空间复杂度:
O(n),用于存储去重后的分数列表。
解题思考:
在解题过程中,要特别注意数组中可能会出现重复的分数。因此,去重是一个关键步骤,确保找到的是第三大不同的分数而非相同分数的重复。排序后选择第三大的分数需要用[2]下标来获取,理解Python中列表索引从0开始是必要的。
此外,针对数组长度和不同分数数量的判断也是解题的核心。通过条件len(unique_scores) >= 3来决定是返回第三大分数还是最大的分数,这个判断在题目中起着至关重要的作用,避免了数组长度不足三时索引越界的问题。