这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战。
题目描述:
414. 第三大的数 - 力扣(LeetCode) (leetcode-cn.com)
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例一
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1 。
示例二
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 。
示例三
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
1 <= nums.length <= 10^4-2^31 <= nums[i] <= 2^31 - 1
进阶:
你能设计一个时间复杂度 的解决方案吗?
思路分析
排序
排序就比较简单了,我们排完序,从头遍历的时候要先把数组反转一下,然后找到第三个数就ok了,这里主要注意下相同的元素算一个就行了
我们有2个办法
- 我们反转之后去重即可
- 我们只需要定义一个指针就可以做到记录
AC代码
class Solution {
fun thirdMax(nums: IntArray): Int {
val num = nums.distinct().sorted()
return if (3 <= num.size) {
num[num.size - 3]
} else {
num[num.lastIndex]
}
}
}
Set集合
由于题目需要找到第三大的数,所以我们只需要维护一个大小为3的Set即可
我们遍历数组,将值插入集合,若有序集合的大小超过 3,就删除集合中的最小元素。这样可以保证有序集合的大小至多为 3,且遍历结束后,若有序集合的大小为 3,其最小值就是数组中第三大的数;若有序集合的大小不足 3,那么就返回有序集合中的最大值。
AC代码
class Solution {
fun thirdMax(nums: IntArray): Int {
val set = TreeSet<Int>()
for (n in nums){
set.add(n)
if(set.size > 3) {
set.remove(set.first())
}
}
if (set.size == 3) {
return set.first()
} else {
return set.last()
}
}
}
总结
so easy