LeetCode414. 第三大的数

题目

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:

输入: [3, 2, 1]

输出: 1

解释: 第三大的数是 1.

示例 2:

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:

输入: [2, 2, 3, 1]

输出: 1

解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

示例 1:

输入: [3, 2, 1]

输出: 1

解释: 第三大的数是 1.

示例 2:

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:

输入: [2, 2, 3, 1]

输出: 1

解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

分析

这个题,看起来一点儿也不难诶,可是不知道为啥就那么多坑。

扫描二维码关注公众号,回复: 1854998 查看本文章

首先要求on时间复杂度,那么都各种排序就不可以了,但是还是想到了堆排序,堆排序n*log(n)还是不符合要求。

而且题中数据存在2的-31次方也就是-2147483648,很奇怪的是不管是TreeSet还是堆排序的降序排序,-2147483648比其他的数字都要大,比如说在TreeSet中添加入-2147483648, 2,  3,  4,  5 ,在TreeSet的降序排序输出是这个样子:-2147483648 , 5 ,4 ,3 ,2 好无奈啊,不知道为啥这样,堆排序也是这个样子,这导致了我,不能用set储存去重了。

最终还是用了三个整型变量,maxF maxS maxT 分别保存最大第二大第三大的数字。

要注意的是,maxF maxS maxT最好要定义成Integer类型,不要定义为int型,因为题中数据在2的-31次方到2的31次方-1 范围内各个数字都有可能出现,而如果定义为int型无法给初值,后续将无法判断,int型初始并不能定义为null,那就用对象Integer,初始为null。

还有一点要注意的是啊,Integer类的 == 和 equals()方法的不同。因为Integer是对象 ,不在0-128(好像是这个范围)之外的不入缓存,比如378  :Integer a = 378 ;a.equals(378) ; a==378; 分别返回true和false


代码

class Solution {
    public int thirdMax(int[] nums) {
        Integer maxF = null;
        Integer maxS = null;
        Integer maxT = null;

        for( Integer i : nums){
//            if (i == maxF || i == maxT || i == maxS) 不可以这样写!!!
            if (i.equals(maxF) || i.equals(maxT) || i.equals(maxS))continue;
            if ( maxF == null || i > maxF ){
                maxT = maxS;
                maxS = maxF;
                maxF = i;
            }else if (maxS == null || i > maxS){
                maxT = maxS;
                maxS = i;
            }else if (maxT == null || i > maxT){
                maxT = i;
            }

        }

        return maxT == null ? maxF : maxT;
    }
}


猜你喜欢

转载自blog.csdn.net/qq_38595487/article/details/80835686