[LeetCode] Third Maximum Number

linspiration發表於2019-01-19

Problem

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

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

class Solution {
    public int thirdMax(int[] nums) {
        if (nums == null || nums.length == 0) return -1;
        int first = Integer.MIN_VALUE, second = first, third = first;
        boolean firstExists = false, secondExists = false, thirdExists = false;
        for (int num: nums) {
            if (num >= first) {
                if (!firstExists) {
                    first = num;
                    firstExists = true;
                } else if (num == first) {
                    continue;
                } else {
                    if (secondExists) {
                        third = second;
                        thirdExists = true;
                    } else {
                        secondExists = true;
                    }
                    second = first;
                    first = num;
                }
            } else if (num >= second) {
                if (!secondExists) {
                    second = num;
                    secondExists = true;
                } else if (num == second) {
                    continue;
                } else {                    
                    if (!thirdExists) {
                        thirdExists = true;
                    }                   
                    third = second;
                    second = num;
                }
            } else if (num >= third) {
                thirdExists = true;
                third = num;
            }
        }
        System.out.println(first);
        System.out.println(second);
        System.out.println(third);

        return thirdExists == false ? first : third;
    }
}

相關文章