1.题目

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

示例:

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

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

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

2.思路

  1. 使用max1表示第一大的数,max2表示第二大的数,max3表示第三大的数
  2. 遍历数组,如果当前数字是重复的就跳过,否则更新max1,max2和max3
  3. 遍历结束,如果max3依然是初始的最小值,说明第三大的数不存在,返回max1,否则返回max3
  1. public int thirdMax(int[] nums) {
  2. long max1 = Long.MIN_VALUE, max2 = Long.MIN_VALUE, max3 = Long.MIN_VALUE;
  3. for (int num : nums) {
  4. if (num == max1 || num == max2 || num == max3) continue;
  5. if (num > max1) {
  6. max3 = max2;
  7. max2 = max1;
  8. max1 = num;
  9. } else if (num > max2) {
  10. max3 = max2;
  11. max2 = num;
  12. } else if (num > max3) {
  13. max3 = num;
  14. }
  15. }
  16. return (int) (max3 == Long.MIN_VALUE ? max1 : max3);
  17. }