Third Maximum Number LT414

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.

 Idea. Unique is the key, at first tried Integer.MIN_VALUE to initialise the array, more work to tell if the max3 is MIN_VALUE or not, use null instead

Time complexity: O(N)

Space complexity: O(1)

 1 class Solution {
 2     public int thirdMax(int[] nums) {
 3         Integer max1 = null;
 4         Integer max2 = null;
 5         Integer max3 = null;
 6         
 7         for(int num: nums) {  
 8             if(max1 == null || num > max1) {
 9                 max3 = max2;
10                 max2 = max1;
11                 max1 = num;
12             }
13             else if(num != max1 && (max2 == null || num > max2)) {
14                 max3 = max2;
15                 max2 = num;
16             }
17             else if((num != max1 && num != max2) && (max3 == null || (num > max3))) {
18                 max3 = num;
19             }
20         }
21         
22         if(max3 == null) {
23             return max1;
24         }
25         return max3;
26     }
27 }

Use Integer to wrap the array, to remove the duplicates in max1, max2 and max3, avoid the long if conidition

 1 class Solution {
 2     public int thirdMax(int[] nums) {
 3         Integer max1 = null;
 4         Integer max2 = null;
 5         Integer max3 = null;
 6         
 7         for(Integer num: nums) { 
 8             if(num.equals(max1) || num.equals(max2) || num.equals(max3)) {
 9                 continue;
10             }
11             
12             if(max1 == null || num > max1) {
13                 max3 = max2;
14                 max2 = max1;
15                 max1 = num;
16             }
17             else if(max2 == null || num > max2) {
18                 max3 = max2;
19                 max2 = num;
20             }
21             else if(max3 == null || num > max3) {
22                 max3 = num;
23             }
24         }
25         
26         if(max3 == null) {
27             return max1;
28         }
29         return max3;
30     }
31 }

Another idea, use Long.MIN_VALUE instead

 1 class Solution {
 2     public int thirdMax(int[] nums) {
 3         long max1 = Long.MIN_VALUE;
 4         long max2 = Long.MIN_VALUE;
 5         long max3 = Long.MIN_VALUE;
 6         
 7         for(int num: nums) {
 8             if(num > max1) {
 9                 max3 = max2;
10                 max2 = max1;
11                 max1 = num;
12             }
13             else if(num != max1 && num > max2) {
14                 max3 = max2;
15                 max2 = num;
16             }
17             else if((num != max1 && num != max2) && num > max3) {
18                 max3 = num;
19             }
20         }
21         
22         return max3 == Long.MIN_VALUE? (int)max1 : (int)max3;
23     }
24 }

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.

猜你喜欢

转载自www.cnblogs.com/taste-it-own-it-love-it/p/10850680.html