题目描述
题干:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 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的属性就是默认排序,像小根堆模型一样,模拟的思路也是一绝,不过确实最慢的
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见