刷题日记-414. 第三大的数

92 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

414. 第三大的数

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

示例 1:

输入:[3, 2, 1]
输出:1
解释:第三大的数是 1

示例 2:

输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2

示例 3:

输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1

提示:

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1

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

二、思路分析

看到这题目,很容易想到排序,直接找第三大的数,但是这也太没意思了,同时排序的时间复杂度也肯定超了。

正常来说有序集合是一种,而如果是一次遍历的话,我们的主要思路就是用三个变量来维护第一大、第二大、第三大三个数,具体的比较就是每遍历到一个数都进行比较。

三、AC 代码

    public int thirdMax(int[] nums) {
        int max1 = Integer.MIN_VALUE;
        int max2 = Integer.MIN_VALUE;
        int max3 = Integer.MIN_VALUE;
        for (int num : nums) {
            max1 = Math.max(max1, num);
        }
        for (int num : nums) {
            if (num != max1) {
                max2 = Math.max(max2, num);
            }
        }

        boolean max3Use = false;
        for (int num : nums) {
            if (num != max1 && num != max2) {
                max3Use = true;
                max3 = Math.max(max3, num);
            }
        }
        
        if (max3Use) {
            return max3;
        } else {
            return max1;
        }
    }

四、总结

其实这个也不是通解,我们现在是找第三大,可以使用三个变量,如果是k个大的话就不好找了。