leetcode-414-第三大的数

该博客介绍了如何在给定数组中找到第三大的数。通过两种方法实现:一是采用排序+擂台法,初始化三个擂主并遍历数组,根据数值大小更新擂主;二是利用有序集合,每次插入新数并保持集合大小不超过3,最后返回集合中的第三大数。代码示例展示了排序+擂台法的实现。
摘要由CSDN通过智能技术生成

1、描述

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。

2、提示:

a. 1 <= nums.length <= 104
b. -231 <= nums[i] <= 231 - 1

3、思路

3.1、排序+擂台

参考 寻找序列中最大数值的方法——擂台法:一次遍历,每次数值 和 擂主比较,只有 擂主输了即数值更小,才 更换 擂主。

该题 使用3个等级的擂主 a、b、c 来维护,存放 最大值、次大值、第三大值,也是 一次遍历。
遍历过程中,只有当 数值 大小在某个区间,如(a,)、(b,a)、(c,b),才会更换擂主,不考虑相同值。
注意的是,3个擂主 的初值 都是最小值,并且 最后 返回结果时,只有当 c不为 初值即最小值,才返回 c,否则返回 a,即最大值。

此外,另一种不依赖元素范围的做法是,将 a、b 和 c 初始化为空指针或空对象,视作「无穷小」,并在比较大小前先判断是否为空指针或空对象。遍历结束后,若 c 为空,则说明第三大的数不存在,返回 a,否则返回 c。

形式:
float("INF")表示为正无穷;
float("-INF")表示负无穷

3.2、有序集合

有序集合来维护数组中前三大的数。
每遍历一个数,就将其插入有序集合,若有序集合的大小超过 3,就删除集合中的最小元素。
遍历结束后,若有序集合的大小为 3,其最小值就是数组中第三大的数;若有序集合的大小不足 3,那么就返回有序集合中的最大值。

4、代码

4.1、排序+擂台

    def thirdMax(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) < 3:
            return max(nums)
        import sys
        a, b, c = -sys.maxsize - 1, -sys.maxsize - 1, -sys.maxsize - 1
        for num in nums:
            if c < num < b:
                c = num
            elif b < num < a:
                b, c = num, b
            elif num > a:
                a, b, c = num, a, b
        return a if c == -sys.maxsize - 1 else c
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值