LeetCode.414 第三大的数

305 阅读1分钟

这是我参与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

进阶:

你能设计一个时间复杂度 O(n)O(n)  的解决方案吗?

思路分析

排序

排序就比较简单了,我们排完序,从头遍历的时候要先把数组反转一下,然后找到第三个数就ok了,这里主要注意下相同的元素算一个就行了

我们有2个办法

  1. 我们反转之后去重即可
  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

参考

第三大的数 - 第三大的数 - 力扣(LeetCode) (leetcode-cn.com)