package com.fishercoder.solutions;

/**
 * 414. Third Maximum Number
 *
 * 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.
 */
public class _414 {

    public int thirdMax(int[] nums) {
        long max1 = Long.MIN_VALUE;
        long max2 = Long.MIN_VALUE;
        long max3 = Long.MIN_VALUE;
        for (int i : nums) {
            max1 = Math.max(max1, i);
        }
        for (int i : nums) {
            if (i == max1) {
                continue;
            }
            max2 = Math.max(max2, i);
        }
        for (int i : nums) {
            if (i == max1 || i == max2) {
                continue;
            }
            max3 = Math.max(max3, i);
        }
        return (int) (max3 == Long.MIN_VALUE ? max1 : max3);
    }

}

@@ -676,16 +676,56 @@
 _414 %7B%0A%0A
+    public static class Solution1 %7B%0A    
     publ
@@ -754,32 +754,36 @@
 nums) %7B%0A        
+    
 long max1 = Long
@@ -786,32 +786,36 @@
 Long.MIN_VALUE;%0A
+    
         long max
@@ -834,32 +834,36 @@
 _VALUE;%0A        
+    
 long max3 = Long
@@ -866,32 +866,36 @@
 Long.MIN_VALUE;%0A
+    
         for (int
@@ -919,16 +919,20 @@
         
+    
 max1 = M
@@ -949,34 +949,42 @@
 x1, i);%0A        
+   
+ 
 %7D%0A
+    
         for (int
@@ -1000,32 +1000,36 @@
 ) %7B%0A            
+   
+ 
 if (i == max1) %7B
@@ -1037,32 +1037,36 @@
                 
+    
 continue;%0A      
@@ -1063,34 +1063,42 @@
 ue;%0A            
+   
+ 
 %7D%0A
+    
             max2
@@ -1119,34 +1119,42 @@
 x2, i);%0A        
+   
+ 
 %7D%0A
+    
         for (int
@@ -1170,32 +1170,36 @@
 ) %7B%0A            
+  
+  
 if (i == max1 %7C%7C
@@ -1220,32 +1220,36 @@
                 
+    
 continue;%0A      
@@ -1246,34 +1246,42 @@
 ue;%0A            
+  
-%7D%0A
+  %7D%0A    
             max3
@@ -1302,34 +1302,42 @@
 x3, i);%0A        
+  
-%7D%0A
+  %7D%0A    
         return (
@@ -1385,13 +1385,22 @@
 3);%0A    
+    %7D%0A    
 %7D
-%0A
 %0A%7D%0A

refactor 414