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.
Solution 1: use three variants first,second,third to represent the first,second,third maximum. Note that use long long type to solve the condition that INT_MIN exists in the array. (Line 4)
1 class Solution { 2 public: 3 int thirdMax(vector<int>& nums) { 4 long long first=LLONG_MIN, second=LLONG_MIN, third=LLONG_MIN; // 5 for (int num:nums) { 6 if (num>first) { 7 third=second; 8 second=first; 9 first=num; 10 } 11 else if (num<first && num>second){ 12 third=second; 13 second=num; 14 } 15 else if (num<second && num>third){ 16 third=num; 17 } 18 } 19 return (third==LLONG_MIN)?first:third; 20 } 21 };
Solution 2: use the functions of set: ordering and including unique key. Set is implemented with red-black tree, the complexity of operation of insert is O(log3) and erase is O(1), so the total complexity is O(n).
1 class Solution { 2 public: 3 int thirdMax(vector<int>& nums) { 4 set<int> s; 5 for (int num:nums){ 6 s.insert(num); 7 if (s.size()>3){ 8 s.erase(s.begin()); 9 } 10 } 11 return (s.size()<3)?*(s.rbegin()):*s.begin(); 12 } 13 };