Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 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个大的话就不好找了。