LeetCode——414. 第三大的数(Java)

题目描述

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

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

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

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

题解思路

返回第三个大的数,这里有个坑,是第三个不同的数字,不是大小排第三的数字

这里当然一看到是排序的问题,首先想到的就是sort排序然后找到第三个大的数字即可

看了官方题解的其他两种思维后,觉得很精妙,但是最后在复杂度上却没有最简单的快

值得一提的是利用set集合中的TreeSet来优雅的排序去前三个确实是值得学习和借鉴的

正确代码

    public int thirdMax1(int[] nums) {
        Integer a = null, b = null, c = null;
        for (int num : nums) {
            if (a == null || num > a) {
                c = b;
                b = a;
                a = num;
            } else if (a > num && (b == null || num > b)) {
                c = b;
                b = num;
            } else if (b != null && b > num && (c == null || num > c)) {
                c = num;
            }
        }
        return c == null ? a : c;
    }

    public int thirdMax2(int[] nums) {
        TreeSet<Integer> treeSet = new TreeSet<>();
        for (int num : nums) {
            treeSet.add(num);

            if (treeSet.size() > 3) {
                treeSet.remove(treeSet.first());
            }
        }
        return treeSet.size() == 3 ? treeSet.first() : treeSet.last();
    }

    public int thirdMax3(int[] nums) {
        Arrays.sort(nums);

        for (int i = nums.length - 2, diff = 1; i >= 0; i--) {
            if (nums[i] != nums[i + 1] && ++diff == 3) {
                return nums[i];
            }
        }
        return nums[nums.length - 1];
    }

总结

这道题给了我们一个什么思路,再找第几个不同元素的时候,可以用set来去掉重复

并且TreeSet的属性就是默认排序,像小根堆模型一样,模拟的思路也是一绝,不过确实最慢的

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-10-06 15:41  21岁还不是架构师  阅读(74)  评论(0编辑  收藏  举报