Question
Given a non-empty array of integers, return the third maximum number in this array. If it does not exists, return the maximum number. The time complexity must be in O(n).
Note
- 设置3个临时变量,分别存储max1, max2, max3。也可以是一个长度为3的数组。
Extension
- 求第k大的数(k < 5, k值变大,求解效率变低。),都可以使用这个方法来求解。
- 堆排序雏形。求第k大(小),可以建立k长的大顶堆(小顶堆)。
- Java中,PriorityQueue是用数组的形式实现了二叉小顶堆。
Solution
public int thirdMax(int[] nums) {
Integer max1 = null;
Integer max2 = null;
Integer max3 = null;
for (Integer n : nums) {
if (n.equals(max1) || n.equals(max2) || n.equals(max3)) {
continue;
}
if (max1 == null || n > max1) {
max3 = max2;
max2 = max1;
max1 = n;
} else if (max2 == null || n > max2) {
max3 = max2;
max2 = n;
} else if (max3 == null || n > max3) {
max3 = n;
}
}
return max3 == null ? max1 : max3;
}
// 注:此解法非原创,只供提供学习思路。