Description
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).
Example 1:
Input: [3, 2, 1]
Output: 1
Explanation: The third maximum is 1.
Example 2:
Input: [1, 2]
Output: 2
Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
Input: [2, 2, 3, 1]
Output: 1
Explanation: Note that the third maximum here means the third maximum distinct number.
Both numbers with value 2 are both considered as second maximum.
Thinking Process
- Scan through the array, update the largest 3 numbers
- The trick is to use an Integer object to store the numbers, and skip values that already appear in the 3 largest numbers (making sure 3 largest numbers are distinct from one another)
Code
public class Solution {
public int thirdMax(int[] nums) {
Integer max = null;
Integer max2 = null;
Integer max3 = null;
for(Integer num : nums){
if(num.equals(max) || num.equals(max2) || num.equals(max3)) continue;
if(max == null || num > max){
max3 = max2;
max2 = max;
max = num;
}else if(max2 == null || num > max2){
max3 = max2;
max2 = num;
}else if(max3 == null || num > max3){
max3 = num;
}
}
return max3 == null ? max : max3;
}
}
Complexity
- Time complexity is O(n) as the array is scanned exactly once
- Space complexity is O(1)