leetcode414. Third Maximum Number

来源:互联网 发布:手机磁盘清理软件 编辑:程序博客网 时间:2024/06/10 00:33

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: 1Explanation: The third maximum is 1.Example 2:Input: [1, 2]Output: 2Explanation: 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.

解法一

维护3个数,max1,max2,max3,分别存放前3大数,为什么不取int max1 = Integer.Integer.MIN_VALUE,因为
if (max3 > Integer.MIN_VALUE) {
return max3;
}
如果数组中有3个数{0,1,Integer.MIN_VALUE},即不通过。

public class Solution {    public int thirdMax(int[] nums) {        if (nums == null || nums.length == 0) {            return -1;        }        Integer max1 = null;        Integer max2 = null;        Integer max3 = null;        for (Integer num : nums) {            if (num.equals(max1) || num.equals(max2) || num.equals(max3))                continue;            if (max1 == null || num > max1) {                max3 = max2;                max2 = max1;                max1 = num;            } else if (max2 == null || num > max2) {                max3 = max2;                max2 = num;            } else if (max3 == null || num > max3) {                max3 = num;            }        }        if (max3 != null) {            return max3;        }        return max1;    }}

解法二

利用优先队列和set,优先队列只保留3位,所有peek元素就是第3大元素。如果队列的长度小于3,队列中只保留1位元素,即最大的元素。

public class Solution {    public int thirdMax(int[] nums) {        if (nums == null || nums.length == 0) {            return -1;        }        PriorityQueue<Integer> pq = new PriorityQueue<>();        Set<Integer> set = new HashSet<>();        for (int num : nums) {            if (!set.contains(num)) {                pq.offer(num);                set.add(num);                if (pq.size() > 3) {                    set.remove(pq.poll());                }            }        }        if (pq.size() < 3) {            while (pq.size() > 1) {                pq.poll();            }        }        return pq.peek();    }}