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.
题目标签:Array
方法1:
题目给了我们一个nums array, 让我们找到第三大的数。其中重复的数字不算。如果是要找一个max 的数,就很简单,现在是找第三个,那么就需要维护三个max1,max2,max3。
每次找到一个数字比 max1 大的, 或者比max2 大的,或者比max3大的,就需要重新更新三个 max 的值。
还有一点是,这里max1 max2 max3 要用long,因为用int Integer.MIN_VALUE 的话,如果array 中有一个 是 int 里最小的数字, 那么在最后判断max3 是有数字 还是没有的情况下,就不能分辨了。
Java Solution:
Runtime beats 97.74%
完成日期:05/09/2017
关键词:Array
关键点:维护max1,max2,max3
1 public class Solution 2 { 3 public int thirdMax(int[] nums) 4 { 5 long max1, max2, max3; 6 max2 = Long.MIN_VALUE; 7 max3 = max2; 8 9 max1 = nums[0]; 10 11 for(int i=1; i<nums.length; i++) 12 { 13 int curNum = nums[i]; 14 if(curNum > max1) // if find the first maximum number 15 { 16 max3 = max2; // copy max2's value into max3. 17 max2 = max1; // copy max1's value into max2. 18 max1 = curNum; // copy new value into max1. 19 } 20 else if(curNum > max2) // if find the second maximum number 21 { 22 if(curNum != max1) 23 { 24 max3 = max2; // copy max2's value into max3. 25 max2 = curNum; // copy new value into max2. 26 } 27 } 28 else if(curNum > max3) // if find the third maximum number 29 { 30 if(curNum != max2) 31 max3 = curNum; // copy new value into max3. 32 } 33 } 34 35 36 if(max3 == Long.MIN_VALUE) // meaning there is no third maximum value. 37 return (int)max1; 38 else 39 return (int)max3; 40 } 41 }
参考资料:N/A
方法2:
想法一样,不过运用了Integer 可以利用null,不需要把max = MIN_VALUE, 过程也比较简单清楚。
Java Solution:
Runtime beats 50.71%
完成日期:09/19/2017
关键词:Array
关键点:维护max1,max2,max3
1 public class Solution 2 { 3 public int thirdMax(int[] nums) 4 { 5 /* Solution 2: */ 6 Integer max1 = null; 7 Integer max2 = null; 8 Integer max3 = null; 9 10 for(Integer num : nums) 11 { // skip duplicate number 12 if(num.equals(max1) || num.equals(max2) || num.equals(max3)) 13 continue; 14 15 if(max1 == null || num > max1) 16 { 17 max3 = max2; 18 max2 = max1; 19 max1 = num; 20 } 21 else if(max2 == null || num > max2) 22 { 23 max3 = max2; 24 max2 = num; 25 } 26 else if(max3 == null || num > max3) 27 max3 = num; 28 } 29 30 return max3 == null ? max1 : max3; 31 } 32 }
参考资料:
https://discuss.leetcode.com/topic/63715/java-neat-and-easy-understand-solution-o-n-time-o-1-space
LeetCode 题目列表 - LeetCode Questions List